我更改了一个junit测试类以使用Parameterized运行来测试同一接口的两个不同实现。这是:
@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
答案 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);
}
答案 1 :(得分:2)
添加:
@Before
public void setUp() throws Exception {
stack.clear();
}
每个测试共享堆栈,测试会修改堆栈。
答案 2 :(得分:1)
要为所有测试获得一致的堆栈,另一种方法是在特定测试中修改堆栈之前克隆堆栈。
@Test public void testPush() {
Stack<String> myStack = (Stack<String>) stack.clone();
myStack.push("hello");
assertFalse(myStack.empty());
}
因此,每个修改堆栈的测试都应该先克隆它。
这有点麻烦,但允许提供更复杂的堆栈作为参数(例如,带有一些元素的那些参数)。