【问题标题】:How does one write a good unit test without mocking everything?一个人如何在不嘲笑所有内容的情况下编写一个好的单元测试?
【发布时间】:2017-08-25 07:30:27
【问题描述】:

我读过嘲笑一切都是不好的。
Test Smell: Everything is mocked
Mock Everything Is a Good Way to Sink

我还读到单元测试只查看单个组件,而集成测试测试整个系统协同工作。
Writing Great Unit Tests: Best and Worst Practices

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

如何在不模拟所有内容的情况下编写一个好的(孤立的)单元测试?

【问题讨论】:

  • 如果不知道“一切”是什么意思,很难回答。

标签: unit-testing testing junit mocking mockito


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 2016-11-07
    • 2015-06-06
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多