测试使用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();
}

这样的测试有用吗?这些方法需要测试,如何测试?

在我看来,一般情况下,您不应该尝试100%的测试覆盖率。有一个高的测试覆盖率是好的,有一个完美的覆盖率是无用的,浪费你的时间。任何只将工作设置、获取或委托给另一个方法的方法都不应该进行测试,因为它将花费大量的编写成本,重构时甚至会花费更多。最后,它不会为任何使用API的人增加更多的反回归值或任何帮助。

喜欢真正有智慧的测试方法,有风险的或敏感的。你提交的案例比你自己的代码测试更多的是Mockito。这需要构建时间,对您没有帮助。

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

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

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

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));
}

这并没有什么不同,但与verify相比,如果start能够在不调用setter或getter的情况下达到这种状态,那么它也可以为true。

相关内容

  • 没有找到相关文章