我的测试只是重复代码。对于方法
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。