我对Cactus和模拟对象(jMock,Easy mock)感到困惑。
有人可以回答以下问题吗?
答案 0 :(得分:4)
嗯,这个问题没有很客观的答案,但是模拟对象是关于测试代码的行为,但不能告诉你是否正确地与容器交互。
Cactus在容器中运行你的代码,所以它实际上更像是一个集成测试,但它告诉你的是你的代码实际上正确地与容器交互(它发送的内容是合法的,它返回的内容是真实的)
总而言之,Mock告诉你,如果你想要行为x,你就会得到行为x。 Cactus告诉您行为x实际上在容器中获得了预期的结果。
您使用哪一个取决于您尝试通过测试完成的内容。如果你想做更多的TDD,模拟方法就是你要走的路。你做了单独的原型设计,看看你是否足够了解容器如何编写代码,然后进行单元测试,然后进行集成测试/验收测试以确保一切正常。
但是,如果您正在尝试进行更多传统的单元测试,那么您尝试使用不同的值来尝试测试边缘情况和行为,那么使用模拟进行测试并不会告诉您太多,因为你的容器的一部分缺失了。
我目前更喜欢Mock方法,但如果我要回到Cactus,那么测试容器的不变量就更多了,这样如果我们升级容器,我们知道容器的工作原理没有什么重要的改变。应该影响我们的代码。
答案 1 :(得分:3)
何时使用Cactus进行测试?
用于集成测试(涉及与容器的交互)。这或是仙人掌的最佳选择。这些测试通常是粗粒度的......并且它们的执行速度不是很快。
何时不使用Cactus进行测试?
对于除集成测试之外的其他测试(甚至是集成测试,自从我看过Cactus测试以来已经有一段时间了。)
何时使用模拟对象进行测试?
当您想要对依赖事物隔离进行单元测试时。这些测试通常都是精细的,并且执行速度很快。
何时不使用模拟对象进行测试?
当你想编写集成测试(即测试交互),功能测试等时
Cactus网站上的Mock Objects vs In-Container testing页面总结了这一点。