web-dev-qa-db-ja.com

インターフェースをモックする方法Java PowerMockito

インターフェイスをモックしようとしています。

public interface FlowCopyParamsBusinessManager {
List<FlowCopyParams> findByAppli(String application, String sourcePattern)
        throws FlowCopyParamsBusinessException;

}

私のコードでは、このメソッドfindByAppliを呼び出すと、FlowCopyParamsのリストを返します。

List<FlowCopyParams> lstFlowCopyParams = flowCopyParamsBusinessManager.findByAppli(
                    "TOTO","TATA);

ここで私のクラスのテストでの試み:

@BeforeClass
public static void mockBeanIn() throws Exception {
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>();

PowerMockito.spy(FlowCopyParamsBusinessManager.class);
PowerMockito.when(FlowCopyParamsBusinessManager.class, "findByAppli",  Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);
}  

私はこのエラーがあります:

Java.lang.IllegalArgumentException: object is not an instance of declaring class

メソッドfindByAppliが2つの文字列パラメーターを持っている必要があるため(-===-)、なぜMockito.anyString()およびまだIllegalArgumentExceptionがあります。

どんな手掛かり ?

Thxs。

7
Kikou

PowerMockitoを使用する必要はありません。そのインターフェースとして、モックされていないロジックに依存していないため、spy()を実行する必要はありません。

このようにして、テストクラスでクラス変数を定義できます。

private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock;

@Beforeアノテーション付きメソッド:

flowCopyParamsBusinessManagerMock = Mockito.mock(FlowCopyParamsBusinessManager.class);
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>();
when(flowCopyParamsBusinessManagerMock 
.findByAppli(Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);

次に、テストでflowCopyParamsBusinessManagerMockを参照します。

7
UserF40

FlowCopyParamsBusinessManager.classのインスタンスではなくクラスをスパイしようとしたため、テストが機能しませんでした。

最初に、モックを作成する必要があります。

FlowCopyParamsBusinessManager mockFlowCopyParamsBusinessManager = PowerMockito.mock(FlowCopyParamsBusinessManager.class);

次に、インスタンスをスパイします。

PowerMockito.spy(mockFlowCopyParamsBusinessManager);
PowerMockito.when(mockFlowCopyParamsBusinessManager, "findByAppli", Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);

それもうまくいきます!

1
Kikou

これを実行したのは、この@RunWith(PowerMockRunner.class)をクラスの最上部に配置することです。次に、PowerMockito.mock(MyMock.class)でオブジェクトをモックします。この方法を使用すると、インターフェースまたは最終クラスをモックできます。

0