2015-06-01 4 views
1

Скажем, у меня есть интерфейс с двумя классами, которые реализуют его. Итак, у нас есть интерфейс I, с классами A и B. Для этих 2 классов нам нужно протестировать ту же реализованную функцию doSomething() с JUnit4. Есть некоторые зависимости, поэтому мы используем Mockito. Примерный пример выглядит так:Тестирование нескольких классов с помощью 1 теста

@Mock private dependantClass d; 

@Test 
public void test() { 
    A.doSomething(); 
    verify(d).expectedBehavior(); 
} 

Я написал набор тестов для A (4 теста), никаких проблем. Однако теперь мне приходится реструктурировать набор тестов, чтобы я мог выполнять один и тот же тестовый класс для объектов A и B. Для этого я должен использовать иерархию параллельного класса.

Это оставило меня в тупике. Я попытался использовать аннотацию @Parameters, но это дает мне ошибку, что у меня слишком много входных аргументов. Я пробовал сделать супер-класс тестирования, из которого распространяются как ATest, так и BTest, но я догадываюсь, что я не делаю это правильно, потому что получаю исключения nullpointer.

Фактически копирование всех тестовых примеров и просто изменение A-B проходит все тесты, то есть эти два класса делают то же самое. Я понимаю, что это звучит как ошибочный дизайн, и, честно говоря, возможно. Тем не менее, у меня нет возможности реально изменить код, я просто должен его протестировать.

Я просто делаю что-то неправильно? Как мне это реализовать?

+3

Просьба показать, как вы пытались параметризовать свои тесты. Это правильный подход, и вы, вероятно, пропустили что-то маленькое. – dasblinkenlight

+1

Интересно, почему [параметризованные тесты] (https://github.com/junit-team/junit/wiki/Parameterized-tests) потерпели неудачу в вашем случае. Не могли бы вы опубликовать фрагмент на вашей попытке? –

+1

Это довольно распространенный вариант использования @Parameters, поэтому вам может потребоваться показать некоторые детали этой попытки. «Слишком много входных аргументов» может быть простой ошибкой (такой как несоответствие с сигнатурой конструктора), которая может быть диагностирована, если вы отправляете этот код. – sprinter

ответ

0

Вы можете попробовать JUnit Теории:

@RunWith(Theories.class) 
public class AdditionWithTheoriesTest { 
    private dependantClass d; 

    @Before 
    public void before() { 
    d = mock(dependantClass); 
    } 

    @DataPoints 
    public static I[] positiveIntegers() { 
    return new I[]{ 
     new A(d),   //inject d into A, may differ 
     new B(d)   //inject d into B, may differ 
    }; 

    } 

    @Theory 
    public void test(I data) { 
    data.doSomething(); 
    verify(d).expectedBehavior(); 
    } 

То же самое можно сделать с помощью @Parameters (если настроено правильно). Тем не менее @Parameters больше подходит для тестирования одного класса с несколькими данными. @Theories предназначен для утверждения одинакового поведения для разных аргументов (например, нескольких классов).

+0

Вы, вероятно, имеете в виду 'data.doSomething()' И вы получаете доступ к 'd' из статического контекста, это не сработает –

Смежные вопросы