如何模拟对 Junit 内部方法的调用
How to mock a call for inner method for Junit
我有以下内容:
public class A{
private SOAPMessage msg;
SOAPMessage getmSOAP()
{
return msg;
}
public Map<String,String> getAllProfiles(String type) throws SOAPException
{
NodeList profilesTypes = getmsoapResponse().getSOAPBody().getElementsByTagName("profileType");
...
}
}
我想在 getAllProfiles(String value)
一侧模拟 getmsoapResponse()
的调用并注入我自己的 SOAPMessage
.
正在尝试一些无效的方法:
运行 A:
m_mock = Mockito.mock(A.class);
Mockito.when(m_mock .getmsoapResponse()).thenReturn(m_SOAPRespones);
Mockito.when(m_mock .getAllProfiles("")).thenCallRealMethod();
运行 B:
m_mock = spy(new A())
doReturn(m_SOAPRespones).when(m_mock ).getmsoapResponse();
两个都不行,我做错了什么?
运行 B 最后成功了,有一个小错误。
建议的答案也很有效。
您只遗漏了一件事:您还需要在此处模拟 .getSoapBody()
的结果。
以下是关于类的假设;只需替换为适当的 类;另请注意,我尊重 Java 命名约定,您也应该这样做:
final A mock = spy(new A());
final SOAPResponse response = mock(SOAPResponse.class);
final SOAPBody body = mock(SOAPBody.class);
// Order does not really matter, of course, but bottom up makes it clearer
// SOAPBody
when(body.whatever()).thenReturn(whatIsNeeded);
// SOAPResponse
when(response.getSoapBody()).thenReturn(body);
// Your A class
when(mock.getSoapResponse()).thenReturn(response);
when(mock.getAllProfiles("")).thenCallRealMethod();
简而言之:您需要模拟链中的所有元素。并且请务必遵循 Java 命名约定,这样以后阅读您的代码的人会更容易 ;)
我有以下内容:
public class A{
private SOAPMessage msg;
SOAPMessage getmSOAP()
{
return msg;
}
public Map<String,String> getAllProfiles(String type) throws SOAPException
{
NodeList profilesTypes = getmsoapResponse().getSOAPBody().getElementsByTagName("profileType");
...
}
}
我想在 getAllProfiles(String value)
一侧模拟 getmsoapResponse()
的调用并注入我自己的 SOAPMessage
.
正在尝试一些无效的方法: 运行 A:
m_mock = Mockito.mock(A.class);
Mockito.when(m_mock .getmsoapResponse()).thenReturn(m_SOAPRespones);
Mockito.when(m_mock .getAllProfiles("")).thenCallRealMethod();
运行 B:
m_mock = spy(new A())
doReturn(m_SOAPRespones).when(m_mock ).getmsoapResponse();
两个都不行,我做错了什么?
运行 B 最后成功了,有一个小错误。
建议的答案也很有效。
您只遗漏了一件事:您还需要在此处模拟 .getSoapBody()
的结果。
以下是关于类的假设;只需替换为适当的 类;另请注意,我尊重 Java 命名约定,您也应该这样做:
final A mock = spy(new A());
final SOAPResponse response = mock(SOAPResponse.class);
final SOAPBody body = mock(SOAPBody.class);
// Order does not really matter, of course, but bottom up makes it clearer
// SOAPBody
when(body.whatever()).thenReturn(whatIsNeeded);
// SOAPResponse
when(response.getSoapBody()).thenReturn(body);
// Your A class
when(mock.getSoapResponse()).thenReturn(response);
when(mock.getAllProfiles("")).thenCallRealMethod();
简而言之:您需要模拟链中的所有元素。并且请务必遵循 Java 命名约定,这样以后阅读您的代码的人会更容易 ;)