メソッドは、モック オブジェクトを使用しても使用しなくてもテストできます。次の理由により、モックが必要ない場合は、モックを使用しないソリューションを好みます。
- それらはテストを理解しにくくします。
- リファクタリング後、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です)。
モックを使用せずに、そのテストを以下のように変更しました。以下のテストは、ビルダーに null 以外の 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());
}
必要がない限りモックは使用しませんが、これは理にかなっているのだろうか、それともモックのテスト方法を誤解しているのでしょうか。