Junit 5 — Как передать несколько нулевых значений для @CsvSource?

#junit #junit5

#junit #junit5

Вопрос:

Я изменяю метод тестирования с одного параметра на несколько:

 @ParameterizedTest
@NullSource
@ValueSource({"foo", "bar"..})
void shouldReturnFalse(String x) {
  assertThat(someMethod(x)).isFalse();
}

@ParameterizedTest
@CsvSource({
  "null, null",
  "foo, bar"
})
void shouldReturnFalse(String x, String y) {
  assertThat(someMethod(x, y)).isFalse();
}
 

null здесь передается как строковый литерал вместо нулевого литерала. В результате этот тест завершается неудачей. Этот тест ранее работал с одним аргументом with @NullSource , но при переключении на несколько выдает следующую ошибку:

org.junit.jupiter.api.extension.Исключение ParameterResolutionException: для параметра не зарегистрирован параметр ParameterResolver…

Я не смог найти обходной путь для этого, и решения, которые я видел, были довольно сложными и громоздкими. Есть ли более простой способ предоставления значений null ?

Ответ №1:

@CsvSource имеет вызываемый атрибут nullValues . Смотрите документацию.

Список строк, которые следует интерпретировать как нулевые ссылки.

 @CsvSource(value= {"null, null",
                   "foo, bar"}
           , nullValues={"null"})
 

Другой вариант — просто не передавать никаких значений, как указано в ранее связанной документации.

Пожалуйста, обратите внимание, что пустые значения без кавычек всегда будут преобразовываться в нулевые ссылки независимо от значения этого атрибута nullValues ; тогда как пустая строка в кавычках будет обрабатываться как emptyValue() .

 @CsvSource({",",
            "foo, bar"})
 

Ответ №2:

Вы можете использовать нулевые значения, как описано выше @Jan Schmitz, или вы можете просто отбросить нулевые значения следующим образом:

 @CsvSource({
  ",",
  "foo, bar"
})