使用EasyMock实现单元测试的良好实施

时间:2015-08-21 15:21:31

标签: java unit-testing easymock

我有一个关于使用EasyMock很好地实现单元测试的问题。

首次实施:

Capture<String> capturedString = newCapture();
myService.doSomething(capture(capturedString));
expectLastCall();

assertEquals("stringValue", catpuredString.getValue());

第二次实施:

myService.doSomething("stringValue");
expectLastCall();

我对第一次实现感到满意,因为存在断言。但在第二个实现中,我希望“stringValue”传递给我的服务。如果不是这种情况,EasyMock会抛出异常。那两个实现之间有区别吗?如果不是,那么一个比另一个好吗?

感谢。

2 个答案:

答案 0 :(得分:2)

GreenGiant的答案非常好。两种方式在结果上是等同的,但有不同的感觉。顺便说一句,没有必要添加expectLastCall()。它隐含在void方法上。

添加答案:

期望是你期望发生的事情。你关心的事情。例如,如果您关心调用doSomething,但您不关心传递的参数,则可以使用any()作为匹配器。表明你的意图(你不在乎)。如果参数确实重要,则等于匹配器是有意义的。

然后,确实经常使用捕获因为你不太确定会传递什么。例如,如果对象上没有定义equals()方法。

当我要检查复杂对象时,我倾向于使用捕获和断言列表。如果我有一个包含许多字段的bean,那么使用cmpEq匹配器就可以更容易地获得一个断言列表。

然后,此方法的唯一缺点是您不会立即知道传递的参数无效。测试的方法将继续执行,之后可能会失败。因此,您永远不会达到您的断言,并认为错误在代码中比实际情况更远。

但是经过测试的代码是非常原子的而且不是太复杂,这不应该发生太多。

答案 1 :(得分:1)

我想这只取决于你是否在录制模拟调用之前预先知道字符串值。

  • 如果您已经知道字符串值,那么请使用第二个实现,因为它更简单。
  • 但如果您不提前知道,那么请使用第一个实现。例如,如果传递给您的服务的值是动态的,并且您在实际运行测试之前不知道它应该是什么。