我应该在单元测试时模拟所有依赖项吗?

时间:2014-05-14 00:13:11

标签: unit-testing mocking

我的班级有依赖,我在单元测试中嘲笑。我在一个对我没有多大意义的地方得到了一个空引用异常。

我刚才意识到这是因为我没有设置我的模拟依赖。此依赖项已经过测试,但它不会连接到文件系统或数据源等任何内容。

我只想在这个新课程中测试我的新代码,但我想在这种情况下,最好是来模拟。

这个结论是否正确?

3 个答案:

答案 0 :(得分:7)

这听起来像是在你的情况下工作,但一般情况下,存在或模拟的唯一原因是获取外部数据源而不是你的测试,这是不正确的。头发。其他原因包括

  • 一个方法本身可能很慢
  • 可能很难找到合适的参数来传递给另一个类的方法来让它返回测试方法所需的值
  • 您正在测试的方法需要另一个类的实例,该实例会发生很大变化,并且您不希望调用者的测试在被调用者更改时中断
  • 您依赖的方法很复杂,需要自己的测试,完全测试您的方法而不用存根或模拟意味着完全测试它调用的方法(在您的方法自己的测试中),这会导致重复在你的类的测试和它所调用的方法的测试之间
  • 你从外面做TDD并且你还没有写过被调用者,只是设计了它的界面!

答案 1 :(得分:6)

正确。你应该模仿依赖于持久性或外部性的东西,以防止测试依赖于任何持久性或外部性的东西。

如果依赖性不依赖于任何持久性或外部性,那么通过模拟它获得的唯一好处是即使依赖性错误,测试也能正常工作 - 但假设模拟正常工作。为此你需要:

  1. 编写一个完全模拟依赖关系的模拟。

  2. 编写一个模拟器,模拟将在测试中使用的特定案例的依赖关系。

  3. 第一个选择是彻头彻尾的荒谬 - 你的模拟为什么要比原来的依赖更好?毕竟,可以安全地假设在原始依赖中投入了比在模拟中更多的努力...

    第二个选项意味着你的mock知道实现的确切细节 - 否则你不会知道实现如何使用依赖,所以你不知道如何模拟这些特定的用途。这意味着测试不能用于单元测试的主要目的之一 - 在更改实现后验证代码是否正常工作。

    模拟的缺点太大而且优点太小 - 特别是考虑到你总是可以运行依赖项的测试来检查它是否正常工作......

答案 2 :(得分:1)

这取决于:您是否可以将依赖关系视为私有实现细节?如果是这样,那么嘲笑它只会让你的测试更加脆弱。

但是,如果它是一个实际为injected into your SUT的依赖项,则绝对应该在单元测试中替换为test double。

The SUT should be the only interesting thing in your test.其他一切应该是死记硬背,无聊和不变,以确保您的SUT在最佳条件下运行(对于正在测试的场景)。

相关问题