3

我对仙人掌和模拟对象(jMock,Easy mock)有点困惑。

有人可以回答以下问题吗?

  1. 何时使用 Cactus 进行测试?
  2. 什么时候不使用 Cactus 进行测试?
  3. 何时使用模拟对象进行测试?
  4. 什么时候不使用模拟对象进行测试?
4

2 回答 2

4

嗯,这个问题没有非常客观的答案,但是模拟对象是关于测试代码的行为,但不能告诉你是否正确地与容器交互。

Cactus 在容器中运行您的代码,因此它实际上更像是一个集成测试,但它告诉您的是您的代码实际上与容器正确交互(它发送的是合法的,它返回的是真实的)。

总而言之,一个 Mock 告诉你,如果你想要行为 x,你就会得到行为 x。Cactus 告诉你行为 x 实际上在容器中得到了预期的结果。

您使用哪一个在很大程度上取决于您要通过测试完成什么。如果你想做更多的 TDD,mock 方法是要走的路。您进行单独的原型设计以查看您是否对容器如何编写代码有足够的了解,然后进行单元测试,然后进行集成测试/验收测试以确保一切正常。

但是,如果您尝试进行更传统的单元测试,在代码中使用不同的值来测试边缘情况和行为,那么使用模拟不会告诉您太多,因为您的很大一部分容器丢失。

我目前更喜欢 Mock 方法,但如果我要回到 Cactus,更多的是测试容器的不变量,这样如果我们升级容器,我们就知道容器的工作方式没有任何重要的变化会影响我们代码。

于 2010-04-13T18:25:53.917 回答
3

何时使用 Cactus 进行测试?

用于集成测试(涉及容器的交互)。那是或曾经是仙人掌的最佳位置。这些测试通常是粗粒度的......并且它们的执行速度不是很快。

什么时候不使用 Cactus 进行测试?

对于集成测试以外的其他测试(甚至对于集成测试,我已经有一段时间没有看到 Cactus 测试了)。

何时使用模拟对象进行测试?

当你想对依赖的东西进行单元测试时。这些测试通常是细粒度的,并且它们的执行速度很快。

什么时候不使用模拟对象进行测试?

当您想编写集成测试(即测试交互)、功能测试等时。

Cactus 网站上的Mock Objects vs In-Container 测试页面很好地总结了这一点。

于 2010-04-13T18:38:25.490 回答