2016-02-07 4 views
2

Я изменил тестовый класс junit для запуска с параметризованным, чтобы протестировать две разные реализации одного и того же интерфейса. Вот он:Неверные результаты с параметром Junit

@RunWith(Parameterized.class) 
public class Stack_Tests { 

private Stack<String> stack; 

public Stack_Tests(Stack<String> stack) { 
    this.stack = stack; 
} 

@Parameters 
public static Collection<Object[]> parameters() { 
    // The two object to test 
    return Arrays.asList(new Object[][] { { new LinkedStack<String>() }, { new BoundedLinkedStack<String>(MAX_SIZE) } }); 
} 

@Test 
public void test() { 
    ... 
} 

Результаты неправильные, так как я изменился на параметр. Половина тестов терпит неудачу (то же самое для двух объектов), все они работали раньше.

Он работает без параметризованных так:

public class Stack_Tests { 

private Stack<String> stack; 

@Before 
public void setUp() throws Exception { 
    stack = new LinkedStack<String>(); 
} 

@Test 
public void test() { 
    ... 
} 

Полный тестовый класс here

+1

Это не так много. Можете ли вы предоставить больше информации о том, как выглядели тесты перед переходом на параметризацию, как они выглядят сейчас, и какой результат дает вам неудачный тест? – ipsi

+0

Я только что последовал за учебником, ничего не изменилось, кроме того, что я задал в вопросе. – DBLouis

+0

Покажите нам те тесты, которые терпят неудачу и как вы определяете параметры. –

ответ

3

Как вы предложили в комментариях, попробуйте переустановить стек перед каждым испытанием, так как предыдущие тесты изменения.

Вы можете создать новый экземпляр стека перед каждым испытанием блока:

@Before 
public void setUp() throws Exception { 
    stack = stack.getClass().newInstance(); 
} 

Хотя это имеет побочный эффект, что ваши классы должны иметь 0-аргумент конструктора.

Примечание: Если некоторые из ваших стеков не могут иметь конструкторы с 0 аргументами, рассмотрите вызов конструктора с аргументами в соответствии с этим значением SO answer. Это означает, что вы должны предоставить список типов конструкторов и список его аргументов вместе с объектом стека в класс единиц измерения в качестве параметров. Тогда вы можете сделать:

@Before 
public void setUp() throws Exception { 
    stack = stack.getClass().getDeclaredConstructors(typesList).newInstance(argsList); 
} 
+0

Тогда все мои классы должны иметь пустой конструктор, не так ли? – DBLouis

+0

Да, они должны иметь пустой конструктор. Я немного поправлю свой ответ, чтобы вы могли передавать объекты вместо классов классу Test. –

+0

Обратите внимание, что это отменяет аргумент MAX_SIZE 'new BoundedLinkedStack (MAX_SIZE)', заданный как параметр в вопросе. – avandeursen

2

добавить:

@Before 
public void setUp() throws Exception { 
    stack.clear(); 
} 

стек разделяется для каждого теста, а также тесты изменять стек.

+0

Ну, это работает, но это отвратительно и непрактично, оно должно обновляться каждый раз (например, с обычным тестом) ... Что делать, если мой объект, если он более сложный и не может вернуться к исходному состоянию? – DBLouis

+0

попробуйте Spock, это лучше, чем чистый junit, и у вас есть много полезных инструментов для такого рода тестов! –

+0

Не ошибетесь, но я не думаю, что предлагать другую библиотеку для решения проблемы - это действительно решение ... – DBLouis

1

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

@Test public void testPush() { 
    Stack<String> myStack = (Stack<String>) stack.clone(); 
    myStack.push("hello"); 
    assertFalse(myStack.empty()); 
} 

Таким образом, каждый тест, который модифицирует стек, должен сначала клонировать его.

Это немного более громоздко, но позволяет создавать более сложные стеки в качестве параметров (например, для некоторых элементов, для начала).

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