![]() |
1
22
取决于你是指mock还是mock?… 假设您只是使用一个模拟框架(如mockito)来创建存根,那么创建您不拥有的类型的存根是完全正确和合理的。 但是,如果您使用模拟框架(例如mockito)创建mock™对象,那么您最好按照mock™福音传道者的建议进行。就我个人而言,我对这一运动失去了联系,所以我不能告诉你,马克·尼达姆的建议是否应该被视为犹太教徒。
讽刺的是,马克写的关于嘲笑的东西
|
![]() |
2
27
我的回答是“不”。在给定的单元测试环境中,您应该模拟任何有意义的东西。不管你是否“拥有”被模仿的类型。 如今,在Java或.NET环境中,一切(我真的意味着一切)都很容易被嘲笑。因此,没有技术上的理由去麻烦首先编写额外的包装器代码。 我最近(2010年11月)一直在思考的一些其他想法表明,“只有你自己的模拟类型”是多么不合逻辑:
对于一个具体的和现实的例子,考虑Apache CuMon电子邮件API,它只不过是标准Java邮件API的包装器。既然我不拥有它,那么每当我为一个需要发送电子邮件的类编写单元测试时,我应该始终为Commons电子邮件API创建一个包装器吗? |
![]() |
3
14
我喜欢 explanation the Mockito project gives 关于这个问题。
|
![]() |
4
8
我本来想说“不”,但我看了一眼博文,就知道他在说什么了。 他特别谈到在冬眠中嘲笑实体经理。我反对这个。实体管理器应该隐藏在DAO(或类似的)中,DAO应该被嘲笑。测试对EntityManager的单线调用完全是在浪费时间,一旦发生任何更改,它就会中断。 但是,如果您确实有第三方代码,那么您一定要测试如何与之交互。 |
![]() |
5
1
嗯,所有权问题无关紧要。 相关问题是 耦合 ,也就是说,您的测试代码指定了什么。您当然不希望测试代码指定您碰巧使用的某个库的API的详细信息。这就是您在测试类中直接使用mockito模拟库时得到的结果。 一 widespread solution proposal 因为这个问题是在库周围创建一个包装器,然后模拟这个包装器。但这有以下缺点:
因此,我建议 将测试与生产代码中的接口完全分离 . 不要将模拟直接放入测试代码,而是创建一个单独的存根类来实现或模拟生产接口。然后在存根中添加第二个接口,允许测试进行必要的设置或断言。然后,您只需要在生产接口发生更改时调整一个类,甚至可以模拟/存根复杂或频繁更改的库的接口。 注意:所有这一切都假定使用模拟或存根实际上是必要的。我没有在这里讨论这个问题,因为它不在OP的问题范围内。但真的 问问自己,你是否需要使用模型/存根 . 根据我的经验,它们被过度使用了… |
![]() |
6
0
我同意马克的说法。不幸的是,你不能嘲笑所有的事情,有些事情你不想嘲笑,只是因为你正常使用它是一个黑匣子。 我的经验法则是模拟的东西,它可以使测试快速进行,但不会使测试变得脆弱。记住并不是所有的假货都是一样的 Mocks are not Stubs . |
![]() |
7
0
我当然是少数人,但我认为嘲笑是一种代码味道,如果可能的话,可以使用依赖注入。其基本原理是模拟基本上是测试一些难以测试的代码的变通方法。模拟会削弱测试,因为它们的行为(充其量)就像库的特定版本。如果库发生变化,您的测试将释放所有的检查值。 你可以从上面看到,我使用的是马克·尼达姆自己的论点,但不是说你不应该嘲笑你不拥有的对象,而是说你根本不应该嘲笑… 好吧,如果依赖注入不是一个选项,那么让我们模拟一下……但是你必须明白你的测试是假的,不会表现得像生产代码。这不是真正的单元测试,只是部分伪造的。如果可能的话,您可以通过添加检查模拟对象的行为是否如预期的那样的测试来减少这种情况。 |