1. ホーム
  2. java

[解決済み] Mockitoでnew()呼び出しのあるクラスをテストする

2023-08-19 13:41:09

質問

レガシーなクラスがあり、そのクラスには new() のインスタンスを作成するための LoginContext オブジェクトのインスタンスを作成します。

public class TestedClass {
  public LoginContext login(String user, String password) {
    LoginContext lc = new LoginContext("login", callbackHandler);
  }
}

このクラスをMockitoでモックしてテストしたいと思います。 LoginContext をモックしたいのですが、JAAS セキュリティをインスタンス化する前に設定する必要があります。 login() メソッドを外部化することなく LoginContext .

Mockito を使って LoginContext クラスをモックすることはできますか?

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

今後のために、私は次のことをお勧めします。 Eran Harelの回答 (移動するリファクタリング new をモック化できるファクトリーに移動するリファクタリング)。しかし、元のソースコードを変更したくない場合は、非常に便利でユニークな機能を使用します。 スパイ . から ドキュメント :

実物のスパイを作成することができます。スパイを使うときは のメソッドが呼び出されます(メソッドがスタブされている場合を除く)。

本物のスパイを使うべき 慎重に、そして時折 例えば、レガシーコードを扱うときなどです。

あなたの場合、書くべきです。

TestedClass tc = spy(new TestedClass());
LoginContext lcMock = mock(LoginContext.class);
when(tc.login(anyString(), anyString())).thenReturn(lcMock);