假设我有一个包含2个类的接口,它们都实现了它。所以我们有接口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都可以扩展的超级测试类,但我猜测我没有做正确的事,因为我得到了nullpointer异常。
实际上复制所有测试用例并且只是将A更改为B会通过所有测试,这就是说这两个类做同样的事情。我意识到这听起来像错误的设计,说实话,它可能是。但是,我没有实际改变代码的可能性,我只需要测试它。
我只是做错了吗?我该如何实现呢?
答案 0 :(得分:0)
你可以试试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
用于在不同的参数(例如多个类)上声明相同的行为。