3

メソッドは、モック オブジェクトを使用しても使用しなくてもテストできます。次の理由により、モックが必要ない場合は、モックを使用しないソリューションを好みます。

  1. それらはテストを理解しにくくします。
  2. リファクタリング後、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());
}

必要がない限りモックは使用しませんが、これは理にかなっているのだろうか、それともモックのテスト方法を誤解しているのでしょうか。

4

2 に答える 2