【问题标题】:How to mock An Interface Java PowerMockito如何模拟接口 Java PowerMockito
【发布时间】:2016-09-01 09:04:40
【问题描述】:

我正在尝试模拟一个界面。

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 方法必须有两个字符串参数,而我放了 Mockito.anyString(),我仍然有 IllegalArgumentException。

有什么线索吗?

谢谢。

【问题讨论】:

    标签: java unit-testing mockito powermock


    【解决方案1】:

    您不需要使用 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

    【讨论】:

    • 我什至不知道间谍具体是做什么的。
    • Spy 允许您使用对象的原始具体实现的部分(方法),而 mock 不会提供任何原始实现。
    • 将@PrepareForTest({interacename.class}) 放在顶部并模拟它。
    【解决方案2】:

    我的测试没有成功,因为我试图监视类而不是 FlowCopyParamsBusinessManager.class 的实例。

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

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

    然后,窥探实例:

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

    同样有效!

    【讨论】:

      【解决方案3】:

      我这样做是把这个@RunWith(PowerMockRunner.class) 放在类的顶部。然后用 PowerMockito.mock(MyMock.class) 模拟对象;这种方式使用可以模拟接口或最终类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多