使用1次测试

时间:2015-06-01 00:58:26

标签: java unit-testing testing mocking mockito

假设我有一个包含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会通过所有测试,这就是说这两个类做同样的事情。我意识到这听起来像错误的设计,说实话,它可能是。但是,我没有实际改变代码的可能性,我只需要测试它。

我只是做错了吗?我该如何实现呢?

1 个答案:

答案 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用于在不同的参数(例如多个类)上声明相同的行为。