如何模拟接口Java PowerMockito

我试图模拟一个界面。

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

}

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

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

在这里我尝试了类测试:

 @BeforeClass public static void mockBeanIn() throws Exception { List 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必须有两个字符串参数 ,我把Mockito.anyString()和我仍然有IllegalArgumentException

任何线索?

Thxs。

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

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

 private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock; 

@Before注释方法中:

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

然后在测试中参考flowCopyParamsBusinessManagerMock

我的测试不起作用,因为我试图窥探类而不是FlowCopyParamsBusinessManager.class的实例。

首先,我们必须创建模拟:

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

然后,间谍实例:

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

它也有效!

我做了这个把@RunWith(PowerMockRunner.class)放在了class级的顶端。 然后使用PowerMockito.mock(MyMock.class)模拟Object; 这样使用可以模拟接口或最终类。