У меня есть интерфейс, например:
public interface Thing {
FrobResult frob(FrobInput);
}
И несколько реализаций этого интерфейса (например, NormalThing
, ImmutableThing
, AsyncThing
), которые я пытаюсь проверить.
Многие из моих методов тестирования действительно касаются обеспечения правильной реализации интерфейса и, таким образом, дублируются в каждой реализации Thing
. В JUnit 3 общим решением для этого было бы создание базового класса (расширение TestCase
), которое затем подклассифицировано каждым классом реализации. Но является ли это правильным подходом для JUnit 4?
Возможные альтернативы в (по-моему) возрастающем порядке предпочтения:
-
Cut'n'paste дублированные методы тестирования. Не СУХОЙ вообще, но я думаю, что менее опасно в тестах, чем в производственном коде.
-
Создайте абстрактный класс с помощью методов
@Test
и подкласс для каждого класса тестирования реализации. (Обычно видели с JUnit 3-тестами - это все-таки хороший способ пойти в JUnit 4?) -
Поместите общие методы тестирования в класс-помощник и вызовите его для каждой реализации. (Состав вместо наследования.)
Какая лучшая практика для № 3? Может быть, тест @RunWith(Parameterized.class)
, который параметризуется при каждой реализации? Или есть лучший способ сделать это?