测试用Mockito重复代码

时间:2015-03-06 13:51:21

标签: java unit-testing junit mocking mockito

我的测试只是重复代码。方法

public void start(Context context) {
    context.setA(CONST_A);
    context.setB(CONST_B);
    ...
}

我使用Mockito编写测试

@Test
public void testStart() throws Exception {
    Context mockContext = mock(Context.class);

    action.start(mockContext);

    verify(mockAction).setA(Action.CONST_A);
    verify(mockAction).setB(Action.CONST_B);
    ...
}

public void act() {
   state.act();
}

测试

@Test
public void testAct() throws Exception {
    State mockState = mock(State.class);
    context.setState(mockState);

    context.act();

    verify(mockState).act();
}

此类测试有用吗?需要测试这些方法以及如何测试它们吗?

3 个答案:

答案 0 :(得分:2)

在我看来,你不应该试图获得100%的测试覆盖率。拥有高测试覆盖率是好的,拥有完美的覆盖范围是没用的,浪费你的时间。任何只设置,获取或委托工作到另一个方法的方法都不应该被测试,因为它会花费你很多的时间来编写,甚至更多的重构。最后,它不会为使用您API的任何人添加更多的反回归值或任何帮助。

首选具有真实智能,风险或敏感的测试方法。您提交的案例比您自己的代码测试更多Mockito。这将花费构建时间,对您没有帮助。

答案 1 :(得分:1)

就个人而言,我并不认为verify()有用,因为它直接测试实现而不是方法的结果。当结果仍然正确时更改实现时,这将导致错误的失败。

至于这是否有用:没有逻辑可以测试,所以没有,它不是特别有用。

答案 2 :(得分:1)

根据我在其他答案中留下的评论

public void start(Context context) {
  context.setA(CONST_A);
  context.setB(CONST_B);
  ...
}

不应该使用Mockito进行测试,而不是

@Test
public void testStart() throws Exception {
   Context context = new Context();

   action.start(context);

   assertThat(context.getA(), equalTo(Action.CONST_A));
   assertThat(context.getB(), equalTo(Action.CONST_B));
}

它没有太大的不同,但与验证相比它也可以实现,如果start设法达到这种状态而不调用setter或getter。