如何在不嘲笑一切的情况下编写好的单元测试?

use*_*782 6 testing junit unit-testing mocking mockito

我读过,嘲笑一切都很糟糕.
测试气味:一切都被嘲笑
模拟一切都是一个好方法

我还读到单元测试看单个组件,而集成测试测试整个系统一起工作.
编写大单元测试:最佳和最差的实践

这让我很困惑.据我所知,要编写一个合适的单元测试,需要通过模拟除SUT之外的所有内容来隔离单个组件如果在整个测试过程中使用真实对象,那么该测试不会成为集成测试吗?

如何在不嘲笑一切的情况下编写好的(隔离的)单元测试?

dav*_*xxx 6

模拟模型是一种难闻的气味.您应该只模拟参与测试方法逻辑的依赖项,而不是数据.但即使有这个简单的规则,事情并不总是显而易见的.

在某些情况下,单元测试方法是直接的,因为该方法有自己的逻辑规则,并且还有一个或两个对不同外部依赖项的调用来执行以完成其逻辑.在这种情况下,嘲弄似乎很自然.

在其他一些情况下,单元测试不太明显,因为测试方法的逻辑规则很少.它在实现中主要调用外部依赖项.在这种情况下,嘲笑似乎非常不自然,因为测试的基本要素可能是嘲弄.通过模拟每个调用来测试流调用是测试白盒子.它很脆弱,因为它不测试方法逻辑行为.它只证明了一件事:你的代码完成了它的工作.

在这种情况下,我认为集成测试应该优于单元测试.