可以使用模擬對象或不使用模擬對象來測試方法。我喜歡的解決方案,而模擬的時候都沒有必要的,因爲:用模擬還是不用模擬測試更好?
- 他們使測試更加難以理解。
- 重構後,修復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());
}
我不會用假除非他們是必要的,但我不知道這是有道理,還是我誤解了測試的模擬方式。