是否可以在调用公共非静态方法时模拟实用程序对象的响应?

时间:2019-02-21 10:50:32

标签: java junit mockito

上下文

我有一个委托类,它是一种“调度程序”,仅具有一个public通用入口点(processRequest)和一组private方法来构成答案:

public class MyDelegateImpl implements MyDelegate {
    @Override
    public MyResponse processRequest(MyInput request)
    {
        //logic to determine a dispatch through the private methods
        switch (methodToUse)
        {
            case 1:
                 return method1();
            case 2:
                 return method2();
            etc.
        }
    }
    private MyResponse method1() {...}
    private MyResponse method2() {...}
    etc.
}

我正在使用框架JUnit测试此类的所有行为。此类的private方法之一包含对实用程序类public的{​​{1}}方法的调用,而不是static的调用,该实用程序类执行对外部服务的SOAP调用:

SOAPPricingHandler

有关信息,这是private MyResponse methodN() { //...stuff SOAPPricingHandler myHandler = new SOAPPricingHandler(); Document soapResponse = myHandler.getSoapAnswer(); //...other stuff return someResponse; } 的基本结构:

SOAPPricingHandler

另外,请考虑在委托中调用public class SOAPPricingHandler { public SOAPPricingHandler() { //some constructions } public Document getSoapAnswer() { //soap call, some reworking and then return mySoapAnswerAsDocument; } } ,这意味着存在一个通用类MyDelegateImpl,它将创建将来的任务并将其MyProxySession方法的执行委托给实现的processRequest

问题

为了对这种行为进行单元测试,我需要在MyDelegate内部模拟这部分代码,而实际上不执行对外部服务的SOAP请求:

private MyResponse methodN()

但是,我不太了解如何(以及是否)可以做到。 我尝试了以下方法:

SOAPPricingHandler myHandler = new SOAPPricingHandler();
Document soapResponse = myHandler.getSoapAnswer();

...,但是它当然不起作用,因为我没有在@Test public void myUnitTest() { ... SOAPPricingHandler soapRequestEngine = new SOAPPricingHandler(); SOAPPricingHandler spySoapRequestEngine = Mockito.spy(soapRequestEngine); Mockito.when(spySoapRequestEngine.getSoapAnswer()).thenReturn(xmlExpectedAnswer); MyResponse response = session.processRequest(someInput); //<-- the SOAPPricingHandler method will be called in here. } 内使用SOAPPricingHandler的监视会话(这正在创建一个新实例)。

如果使用此方法,也会发生同样的情况:

processRequest

有人可以引导我完成此单元测试的正确设计吗?如果您在Mockito.doReturn(xmlExpectedAnswer).when(spySoapRequestEngine).getSoapAnswer(); 中看到一些错误的设计,为了获得更好的可测试性,可以进行不同的设计,那么我也欢迎提出建议。 预先感谢。

0 个答案:

没有答案