可以使用模拟对象或不使用模拟对象来测试方法。我喜欢的解决方案,而模拟的时候都没有必要的,因为:用模拟还是不用模拟测试更好?
- 他们使测试更加难以理解。
- 重构后,修复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);
}
方法中的returnedBuilder OBJ buildLink是“这个”这意味着,因为它们指向建设者和returnedBuilder不能是不同的内存中的相同对象,所以assertEquals并不真正测试它是否包含由buildLink方法(这是pid)设置的期望字段。
我已经改变了测试,如下所示,不使用模拟。下面的测试声明我们要测试的是哪个构建器包含的LinkBuilder不为null,并且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());
}
我不会用假除非他们是必要的,但我不知道这是有道理,还是我误解了测试的模拟方式。