我的班级有依赖,我在单元测试中嘲笑。我在一个对我没有多大意义的地方得到了一个空引用异常。
我刚才意识到这是因为我没有设置我的模拟依赖。此依赖项已经过测试,但它不会连接到文件系统或数据源等任何内容。
我只想在这个新课程中测试我的新代码,但我想在这种情况下,最好是不来模拟。
这个结论是否正确?
答案 0 :(得分:7)
这听起来像是在你的情况下工作,但一般情况下,存在或模拟的唯一原因是获取外部数据源而不是你的测试,这是不正确的。头发。其他原因包括
答案 1 :(得分:6)
正确。你应该模仿依赖于持久性或外部性的东西,以防止测试依赖于任何持久性或外部性的东西。
如果依赖性不依赖于任何持久性或外部性,那么通过模拟它获得的唯一好处是即使依赖性错误,测试也能正常工作 - 但假设模拟正常工作。为此你需要:
编写一个完全模拟依赖关系的模拟。
编写一个模拟器,模拟将在测试中使用的特定案例的依赖关系。
第一个选择是彻头彻尾的荒谬 - 你的模拟为什么要比原来的依赖更好?毕竟,可以安全地假设在原始依赖中投入了比在模拟中更多的努力...
第二个选项意味着你的mock知道实现的确切细节 - 否则你不会知道实现如何使用依赖,所以你不知道如何模拟这些特定的用途。这意味着测试不能用于单元测试的主要目的之一 - 在更改实现后验证代码是否正常工作。
模拟的缺点太大而且优点太小 - 特别是考虑到你总是可以运行依赖项的测试来检查它是否正常工作......
答案 2 :(得分:1)
这取决于:您是否可以将依赖关系视为私有实现细节?如果是这样,那么嘲笑它只会让你的测试更加脆弱。
但是,如果它是一个实际为injected into your SUT的依赖项,则绝对应该在单元测试中替换为test double。
The SUT should be the only interesting thing in your test.其他一切应该是死记硬背,无聊和不变,以确保您的SUT在最佳条件下运行(对于正在测试的场景)。