Junit 参数化的错误结果
Wrong results with Junit parameterized
我使用参数化将 junit 测试 class 更改为 运行 以测试同一接口的两个不同实现。在这里:
@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() {
...
}
因为我改成Parameterized,所以结果不对。一半测试失败(两个对象相同),所有测试都失败了。
无需像这样进行参数化即可工作:
public class Stack_Tests {
private Stack<String> stack;
@Before
public void setUp() throws Exception {
stack = new LinkedStack<String>();
}
@Test
public void test() {
...
}
完整测试classhere
正如您在评论中所建议的那样,尝试在每次测试之前重置堆栈,因为之前的测试会更改它。
您可以在每个单元测试之前创建一个新的堆栈实例:
@Before
public void setUp() throws Exception {
stack = stack.getClass().newInstance();
}
尽管这有副作用,您的 classes 必须有 0 个参数的构造函数。
注意:如果您的某些堆栈不能具有 0 参数构造函数,请考虑按照此 SO answer 调用带参数的构造函数。这意味着您必须向单元测试 class 提供构造函数类型列表及其参数列表以及堆栈对象作为参数。然后你可以这样做:
@Before
public void setUp() throws Exception {
stack = stack.getClass().getDeclaredConstructors(typesList).newInstance(argsList);
}
添加:
@Before
public void setUp() throws Exception {
stack.clear();
}
堆栈为每个测试共享,您的测试修改堆栈。
要为所有测试获得一致的堆栈,另一种方法是在特定测试中修改堆栈之前克隆堆栈。
@Test public void testPush() {
Stack<String> myStack = (Stack<String>) stack.clone();
myStack.push("hello");
assertFalse(myStack.empty());
}
因此,每个修改堆栈的测试都应该首先克隆它。
这有点麻烦,但允许提供更复杂的堆栈作为参数(例如,以某些元素开头的堆栈)。
我使用参数化将 junit 测试 class 更改为 运行 以测试同一接口的两个不同实现。在这里:
@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() {
...
}
因为我改成Parameterized,所以结果不对。一半测试失败(两个对象相同),所有测试都失败了。
无需像这样进行参数化即可工作:
public class Stack_Tests {
private Stack<String> stack;
@Before
public void setUp() throws Exception {
stack = new LinkedStack<String>();
}
@Test
public void test() {
...
}
完整测试classhere
正如您在评论中所建议的那样,尝试在每次测试之前重置堆栈,因为之前的测试会更改它。
您可以在每个单元测试之前创建一个新的堆栈实例:
@Before
public void setUp() throws Exception {
stack = stack.getClass().newInstance();
}
尽管这有副作用,您的 classes 必须有 0 个参数的构造函数。
注意:如果您的某些堆栈不能具有 0 参数构造函数,请考虑按照此 SO answer 调用带参数的构造函数。这意味着您必须向单元测试 class 提供构造函数类型列表及其参数列表以及堆栈对象作为参数。然后你可以这样做:
@Before
public void setUp() throws Exception {
stack = stack.getClass().getDeclaredConstructors(typesList).newInstance(argsList);
}
添加:
@Before
public void setUp() throws Exception {
stack.clear();
}
堆栈为每个测试共享,您的测试修改堆栈。
要为所有测试获得一致的堆栈,另一种方法是在特定测试中修改堆栈之前克隆堆栈。
@Test public void testPush() {
Stack<String> myStack = (Stack<String>) stack.clone();
myStack.push("hello");
assertFalse(myStack.empty());
}
因此,每个修改堆栈的测试都应该首先克隆它。
这有点麻烦,但允许提供更复杂的堆栈作为参数(例如,以某些元素开头的堆栈)。