JUnit-общие тесты различных реализаций [закрыто]
Я ищу наиболее читаемый способ поделиться тестами различных реализаций интерфейса.
Самым популярным, но довольно старым вопросом на эту тему был: - написание одного модульного теста для нескольких реализаций интерфейса .
На поставленный выше вопрос было дано 2 основных и разных ответа -
- параметризованные тесты.
- тест наследования.
Я не удовлетворен и тем и другим ответы.
-
Параметризованный тест-Ответ не включает в себя пример кода того, как параметризовать каждый подкласс. Кроме того, мне лично трудно работать с параметризованным тестом, и я нахожу API совсем не интуитивным.
-
Я всегда боюсь чрезмерного использования наследства, и я не уверен, что тестовое наследование является хорошей практикой.
Интересно, каков будет лучший ответ на этот вопрос в 2018 году?
2 ответа:
Параметризация вашего теста все еще кажется учебным решением для таких задач использования. синтаксис JUnit Jupiter делает его немного более элегантным. API довольно понятен, ИМХО (тесты имеют Аргументы, и аннотация показывает, откуда они берутся):
public class ListTest { public static Stream<List<String>> lists() { return Stream.of(new ArrayList<>(), new LinkedList<>()); } @ParameterizedTest @MethodSource("lists") public void testAdd(List<String> list) { list.add("xyz"); assertEquals(1, list.size()); assertFalse(list.isEmpty()); assertEquals("xyz", list.get(0)); } }
Вероятно, не самый Java-подобный, но вы можете следовать табличному формату тестирования. С помощью локального класса, чтобы сохранить большинство тестов для чтения, и сохранить контекст, максимально приближенных к реальным испытанием, как это возможно.
Примечание: это очень похоже на лежащий в основе высокоуровневый подход
@RunWith(Parameterized.class)
// Assuming Animal interface has a `public boolean canDance()` @Test public void TestAnimalCanDance() { class Tester { String errMsgFmt = "%s failed the test"; boolean expected; Animal animal; public Tester(boolean expected, Animal animal) { this.expected = expected; this.animal = animal; } } Tester dog = new Tester(true, new Dog()); Tester cat = new Tester(false, new Cat()); Tester monkey = new Tester(false, new Monkey()); Tester[] tests = Arrays.asList(dog, cat, monkey); for (Tester t: tests) { boolean actual = t.canDance(); assertTrue(actual == t.expected); } }