如何模拟接口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; 这样使用可以模拟接口或最终类。