JUnit-общие тесты различных реализаций [закрыто]


Я ищу наиболее читаемый способ поделиться тестами различных реализаций интерфейса.

Самым популярным, но довольно старым вопросом на эту тему был: - написание одного модульного теста для нескольких реализаций интерфейса .

На поставленный выше вопрос было дано 2 основных и разных ответа -

  1. параметризованные тесты.
  2. тест наследования.

Я не удовлетворен и тем и другим ответы.

  1. Параметризованный тест-Ответ не включает в себя пример кода того, как параметризовать каждый подкласс. Кроме того, мне лично трудно работать с параметризованным тестом, и я нахожу API совсем не интуитивным.

  2. Я всегда боюсь чрезмерного использования наследства, и я не уверен, что тестовое наследование является хорошей практикой.

Интересно, каков будет лучший ответ на этот вопрос в 2018 году?

2 2

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);
    }
}