如何模拟对 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");
        ...
    }
}

我想嘲笑getmsoapResponse()getAllProfiles(String value)身边的召唤,并注入我自己的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命名约定,这使以后阅读您的代码的人更容易;)

相关内容

  • 没有找到相关文章

最新更新