Как задать имя для параметризированного теста из метода в junit5

Доброго времени суток!
Вопрос по ParameterizedTest
В “dataprovider” я по API получаю данные теста List

public Object[] dataProvider() {
    List<ModelTest> testData;
    Integration integration = new Integration();
    testData= Integration.getTestData();
    Object[] credentials = new Object[testData.size()];
    int i = 0;
    for (ModelTest data : testData) {
      credentials[i] = data;
      i++;
    }
    return credentials;
  }

Далее запускаю тесты

  @ParameterizedTest
  @MethodSource("dataProvider")
  public void goTest(ModelTest test) {
    Logger.printLog("\n======= Запуск сценария: '" + test.getMainData().getTestName() + "' =======\n");
    try {
      Verify.initErrors();
      new ParserScen().parserStepsScen(test);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

При запуске тестов получаю такое наименование:
[1] util.core.parser.scenario.ModelTest@5835e24a

Можно ли как то указать наименование теста из test.getMainData().getTestName()?

Посмотрите в сторону DisplayName и DisplayNameGenerator
https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-name-generator

upd. хотя я ещё раз почитал и кажется вопрос был немного про другое.

Если нужно получать имя теста, то можно попробовать его доставать через TestInfo + getDisplayName - https://www.baeldung.com/junit-get-name-of-currently-executing-test

TestInfo + getDisplayName мне кажется тоже не совсем подходят, это используется для вывода в тесте наименования, где name получаем из названия тестового метода
У меня же наоборот, в самом тесте я могу вывести имя текущего теста.
В моем случае getDisplayName выдает “[1] util.core.parser.scenario.ModelTest@67941d” и проблема как раз в нечитаемости этого имени при прогоне и в отчетах

В общем решение оказалось проще

В “dataprovider” передаю не Object[], а Object[][], где в него передаю и name теста

public Object[] dataProvider() {
    List<ModelTest> testData;
    Integration integration = new Integration();
    testData= Integration.getTestData();
    Object[] credentials = new Object[testData.size()][2];
    int i = 0;
    for (ModelTest data : testData) {
      credentials[i][0] = data;
      credentials[i][1] = data.getMainData().getTestName();
      i++;
    }
    return credentials;
  }

И в самом тесте передаю имя в анотации @ParameterizedTest(name = “[{index}] {1}”)

  @ParameterizedTest(name = "[{index}] {1}")
  @MethodSource("dataProvider")
  public void goTest(ModelTest test, String name)) {
    Logger.printLog("\n======= Запуск сценария: '" + name + "' =======\n");
    try {
      Verify.initErrors();
      new ParserScen().parserStepsScen(test);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }
1 Like