可以使用模拟对象或不使用模拟对象来测试方法。当不需要时,我更喜欢没有模拟的解决方案,因为:
- 它们使测试更难理解。
- 在重构之后,如果它们是用 mock 实现的,那么修复 junit 测试是很痛苦的。
但我想问问你的意见。这里测试的方法:
public class OndemandBuilder {
....
private LinksBuilder linksBuilder;
....
public OndemandBuilder buildLink(String pid) {
broadcastOfBuilder = new LinksBuilder(pipsBeanFactory);
broadcastOfBuilder.type(XXX).pid(pid);
return this;
}
用模拟测试:
@Test
public void testbuildLink() throws Exception {
String type = "XXX";
String pid = "test_pid";
LinksBuilder linkBuilder = mock(LinksBuilder.class);
given(linkBuilder.type(type)).willReturn(linkBuilder);
//builderFactory replace the new call in order to mock it
given(builderFactory.createLinksBuilder(pipsBeanFactory)).willReturn(linkBuilder);
OndemandBuilder returnedBuilder = builder.buildLink(pid);
assertEquals(builder, returnedBuilder); //they point to the same obj
verify(linkBuilder, times(1)).type(type);
verify(linkBuilder, times(1)).pid(pid);
verifyNoMoreInteractions(linkBuilder);
}
方法 buildLink 中的 returnedBuilder obj 是“this”,这意味着 builder 和 returnedBuilder 不能不同,因为它们指向内存中的同一个对象,因此 assertEquals 并没有真正测试它是否包含方法 buildLink 设置的预期字段(这是pid)。
我已按如下方式更改了该测试,但未使用模拟。下面的测试断言我们想要测试的是构建器包含一个不为空的 LinkBuilder 并且 LinkBuilder pid 是预期的。
@Test
public void testbuildLink() throws Exception {
String pid = "test_pid";
OndemandBuilder returnedBuilder = builder.buildLink(pid);
assertNotNull(returnedBuilder.getLinkBuilder());
assertEquals(pid, returnedBuilder.getLinkBuilder().getPid());
}
除非必要,否则我不会使用模拟,但我想知道这是否有意义,或者我误解了模拟测试的方式。