2017-01-09 4 views
4

Есть ли способ параметризованных тестов в JUnit Jupiter (Junit5)?Параметрированное тестовое исполнение в JUnit Jupiter (JUnit5)

@RunWith(Parameterized.class) 

фона:

Я прошел через How to write junit tests for interfaces? и хотел реализовать в качестве тестовых случаев answered here использованием JUnit5. Но не удалось найти один и тот же класс в пакете Юпитера.

Попытки:

Заглядывая заменителей я обнаружил, что Extensions бы заменить @RunWith, как указано в Migrating tips

@RunWith больше не существует; заменяется на @ExtendWith.

Я попытался определение CustomExtension, как это предусмотрено в образце here - MockitoExtension, но не смог добиться успеха в получении использовать экземпляры классов Параметризованных.

Ожидает предложений по тестированию интерфейсов с параметризованными экземплярами классов, реализующих его в JUnit5.

ответ

4

JUnit 5 M4 был только выпущен, и теперь поддерживает параметризованные тесты.

Вот "Hello World" пример:

@ParameterizedTest 
@ValueSource(strings = { "Hello", "World" }) 
void testWithStringParameter(String argument) { 
    assertNotNull(argument); 
} 

Пожалуйста, обратитесь к User Guide для полной документации и дополнительных примеров.

4

По состоянию на 9 января 2017 года JUnit 5 не поддерживает параметризованные тесты как таковые, но работает над этой функцией is in progress. Обратите внимание, что вы можете добиться чего-то подобного с dynamic tests.

То есть, я хотел бы рассмотреть оба плохие пути реализации тестов интерфейса и JUnit Jupiter предлагает два подхода: более

  1. @Test аннотированные методы интерфейса по умолчанию will be executed. Поэтому, если у вас есть производственный интерфейс Interface, вы можете написать интерфейс InterfaceTest, который использует методы по умолчанию, чтобы проверить все, что вы хотите. За каждые Impl implements Interface вы можете написать ImplTest implements InterfaceTest.
  2. Если вам нужно больше гибкости и хотели бы реализовать тесты для Interface в абстрактном классе AbstractInterfaceTest вы можете сделать это, а также и то есть в вашем ImplTest, который простирается AbstractInterfaceTest на nested test class.

Оба этих подхода гарантируют, что тест для интерфейса не знает классов, реализующих интерфейс, что является огромным недостатком answer you linked to.

1

В своих проектах я использую эту библиотеку:

https://github.com/TNG/junit-dataprovider/

для того, чтобы добавить параметризацию мои JUnit тестов. Я использую версию 4.x, но никогда не был поклонником встроенной параметризации, которую он предоставил. Если вы знакомы с @DataProvider TestNg, это расширение не сильно отличается.

Проверьте это, посмотрите, принесет ли он вам какую-либо пользу, как это было для меня и моей команды. Честно говоря, я не мог представить, как сейчас работать без него.

2

Вы можете использовать dynamic tests для этого:

@TestFactory 
Stream<DynamicTest> params() { 

     return Stream.of(new double[][]{{2d, 4d}, {3d, 9d}, {4d, 16d}}). 
       map(i -> 
         dynamicTest("Square root test " + Arrays.toString(i), 
           () -> assertEquals(i[0], Math.sqrt(i[1])) 
         ) 
       ); 
} 
Смежные вопросы