如何模拟接口Java PowerMockito

Kik*_*kou 7 java unit-testing mockito powermock

我试图模拟一个界面.

public interface FlowCopyParamsBusinessManager {
List<FlowCopyParams> findByAppli(String application, String sourcePattern)
        throws FlowCopyParamsBusinessException;
Run Code Online (Sandbox Code Playgroud)

}

在我的代码中,当我调用此方法findByAppli时,我想返回一个FlowCopyParams列表.

List<FlowCopyParams> lstFlowCopyParams = flowCopyParamsBusinessManager.findByAppli(
                    "TOTO","TATA);
Run Code Online (Sandbox Code Playgroud)

在这里我尝试了类测试:

@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);
}  
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

java.lang.IllegalArgumentException: object is not an instance of declaring class
Run Code Online (Sandbox Code Playgroud)

我不知道为什么因为方法findByAppli必须有两个字符串参数,我把Mockito.anyString()和我仍然有IllegalArgumentException.

任何线索?

Thxs.

Use*_*F40 7

您不需要使用PowerMockito,并且作为它的接口,不需要spy(),因为您不依赖于任何非模拟逻辑.

它可以像这样完成,在你的测试类中定义一个类变量.

private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock;
Run Code Online (Sandbox Code Playgroud)

在一个带@Before注释的方法中:

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

然后参考flowCopyParamsBusinessManagerMock你的测试.