假设我有一个接口,两个类都实现了它。所以我们有接口I,类A和b。对于这两个类,我们需要用JUnit4测试相同的实现函数doSomething()。有一些依赖,所以我们使用Mockito。一个测试示例如下:
@Mock private dependantClass d;
@Test
public void test() {
A.doSomething();
verify(d).expectedBehavior();
}
我已经为A编写了测试套件(4个测试),没有问题。但是,现在我必须重构测试套件,以便可以对A和B对象执行相同的测试类。为此,我应该使用并行的类层次结构。
这把我难住了。我已经尝试使用@Parameters注释,但这给了我错误,我有太多的输入参数。我试过做一个超级测试类,ATest和BTest都从扩展,但我猜我没有做对,因为我得到空指针异常。
实际上复制所有测试用例并将A更改为B通过所有测试,也就是说这两个类做相同的事情。我意识到这听起来像是有缺陷的设计,老实说,它可能是。然而,我不可能实际修改代码,我只需要测试它。
是我做错了吗?我应该如何实现这一点?
你可以试试JUnit Theories:
@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
表示对不同的参数(例如多个类)断言相同的行为。