【问题标题】:How to resolve ClassCastException using Mockito/PowerMockito如何使用 Mockito/PowerMockito 解决 ClassCastException
【发布时间】:2017-04-20 22:28:47
【问题描述】:

我需要使用 PowerMocklito 模拟两个静态方法。它为我的第一行代码提供了一个模拟对象,但随后再次调用了相同的方法,但这次它返回了一个不同的对象,这会抛出 ClassCastException。

待测方法

ESignatureJaxBContextFactory context = (ESignatureJaxBContextFactory) AppContext.getBean("jaxbContextFactory");
/// More code
DocusignRESTClient client = (DocusignRESTClient) AppContext.getBean("restServiceClient");

朱尼特

private ESignatureJaxBContextFactory eSignatureJaxBContextFactory;
eSignatureJaxBContextFactory = mock( ESignatureJaxBContextFactory.class );

PowerMockito.when( AppContext.getBean( any( String.class ) ) ).thenReturn( eSignatureJaxBContextFactory );

所以上面的代码行返回了我的模拟上下文,但是当它尝试获取客户端时我得到了一个异常。我该如何测试?

提前致谢

【问题讨论】:

    标签: java junit mockito powermock


    【解决方案1】:

    问题是你在嘲笑AppContext.getBean 为any( String.class ) 试试这个:

    PowerMockito.when(AppContext.getBean("jaxbContextFactory"))
                .thenReturn(eSignatureJaxBContextFactory);
    PowerMockito.when(AppContext.getBean("restServiceClient"))
                .thenReturn(docusignRESTClient);
    

    在这种情况下,当使用参数"jaxbContextFactory" 调用AppContext.getBean 时,它将返回eSignatureJaxBContextFactory,但不会返回任何其他参数。因此,您还需要使用参数"restServiceClient" 模拟调用。

    其他测试方法是提供一组连续的返回值:

    PowerMockito.when(AppContext.getBean(any(String.class)))
                .thenReturn(eSignatureJaxBContextFactory, docusignRESTClient);
    

    在这种情况下,您仍然使用任何 String 值作为参数模拟任何 AppContext.getBean 调用,但告诉 mockito 在第一次调用时返回 eSignatureJaxBContextFactory,并在第二次和任何进一步调用时返回 docusignRESTClient。

    【讨论】:

    • 两种解决方案都对我有用。您的解决方案非常合乎逻辑和简单。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多