如何使用Mockito / PowerMockito

时间:2017-04-19 21:10:36

标签: java junit mockito powermock

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

待测方法

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

的Junit

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

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

因此上面的代码行返回我的模拟上下文,但是当它尝试获取客户端时我得到一个异常。我该怎么测试呢?

提前致谢

1 个答案:

答案 0 :(得分:1)

问题是您正在为AppContext.getBean模仿any( String.class ) 试试这个:

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

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

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

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

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