将生产代码修改为可测试/仅用于测试目的是否是最佳做法?

目前在生产代码中,我有这样的功能


public void doWork() {

    ... call functionA

    ... call functionB

    ... do other work

}

我必须测试一个在 doWork() 中调用函数 A 后需要暂停的情况。而且我没有办法暂停测试框架


所以我把生产改成了


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


这种不必要的开销只是为了能够使代码可测试吗?或者这是可以接受的吗?


MM们
浏览 83回答 1
1回答

POPMUISE

修改代码以使其可测试是完全有效的。测试只是代码的另一个客户端,因此提供有关代码可用性的反馈。另一方面,为了使反馈具有建设性,测试必须遵守一些规则。例如,它应该测试代码的行为,而不是其内部结构。现在,对于实际测试,您有更多的选择。大多数海峡前进将是使用测试替身作为其依赖关系。您提到函数A是最终的,因此不能被嘲笑。它可以。虽然不是理想的解决方案,但模拟2.+和强力莫克都支持嘲笑。final classes更简洁的方法是听你的测试。您的测试告诉您代码存在设计问题。也许你可以解决这些问题。例如,您可以尝试将线程逻辑和执行逻辑分开,以便可以对其进行测试。或者,您可以引入一个接口来使依赖项变得可模拟。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java