目前在生产代码中,我具有这样的功能
public void doWork() {
... call functionA
... call functionB
... do other work
}
我必须测试在doWork()中调用functionA之后需要暂停的情况。而且我没有办法在测试框架中暂停
所以我将生产更改为
public void doWork() {
doWork(new CountdownLatch(0))
}
public void doWork(CountdownLatch latch) {
... call functionA with a latch and functionA calls latch.await()
... call functionB
... do other work
}
现在,我可以创建一个测试案例并使用doWork(new CountdownLatch(1))
但是在生产环境中,它将始终调用doWork()
,而依次调用doWork(new CountdownLatch(0))
这种不必要的开销仅仅是为了使代码可测试吗?还是可以接受?
答案 0 :(得分:2)
修改代码以使其可测试是完全有效的。测试只是代码的另一个客户端,因此可以提供有关代码可用性的反馈。
另一方面,要使反馈具有建设性,测试必须遵守一些规则。例如,它应该测试代码的行为,而不是代码的内部。
现在,对于实际测试,您还有更多选择。
final classes
的模拟。