1. ホーム
  2. java

[解決済み] InjectMocksクラスのメソッドをモックするにはどうすればよいですか?

2023-05-26 14:43:45

質問

例えば、ハンドラを持っています。

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  public int someMethod() {
    ...
    return anotherMethod();
  }

  public int anotherMethod() {...}
}

をテストするために、このように書きたいと思います。

@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  private MyHandler myHandler;

  @Mock
  private MyDependency myDependency;

  @Test
  public void testSomeMethod() {
    when(myHandler.anotherMethod()).thenReturn(1);
    assertEquals(myHandler.someMethod() == 1);
  }
}

しかし、これは実際には anotherMethod() を呼び出してしまいます。どうすればいいのでしょうか? myHandler をモック化するにはどうしたらいいでしょうか?

どのように解決するのですか?

まず最初に、MyHandler のメソッドをモック化する理由は次のようになります。 anotherMethod() をテストしており、それは複雑なロジックを持っています。 someMethod() の一部のような) テストをする必要があるのでしょうか? verify を呼び出しているのでしょうか?

スルーすればいいんです。

@RunWith(MockitoJUnitRunner.class)
class MyHandlerTest {

  @Spy  
  @InjectMocks  
  private MyHandler myHandler;  

  @Mock  
  private MyDependency myDependency;  

  @Test  
  public void testSomeMethod() {  
    doReturn(1).when(myHandler).anotherMethod();  
    assertEquals(myHandler.someMethod() == 1);  
    verify(myHandler, times(1)).anotherMethod();  
  }  
}  

注意:'spying'オブジェクトの場合、'spying'オブジェクトは doReturn の代わりに thenReturn (に変更しました(ちょっとした説明は である。 )