我有一个委托类,它是一种“调度程序”,仅具有一个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();
中看到一些错误的设计,为了获得更好的可测试性,可以进行不同的设计,那么我也欢迎提出建议。
预先感谢。