【问题标题】:Mock spring MessageContext模拟弹簧 MessageContext
【发布时间】:2014-01-16 09:32:49
【问题描述】:

我想模拟这些方法:

SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext.getRequest();
SoapBody requestBody = saajSoapMessage.getSoapBody();

我用这个试过了

messageContextMock = mock(MessageContext.class);
saajSoapMessageMock = mock(SaajSoapMessage.class);

when(messageContextMock.getRequest()).thenReturn((SaajSoapMessage) saajSoapMessageMock);
when(saajSoapMessageMock.getSoapBody()).thenReturn(soapBodyMock);

但我在嘲笑 getSoapBody() 时遇到问题,因为 Junit 给我写信:

at org.springframework.ws.soap.AbstractSoapMessage.getSoapBody(AbstractSoapMessage.java:36)

如何正确模拟这个操作?

编辑(全栈):

java.lang.NullPointerException
    at org.springframework.ws.soap.AbstractSoapMessage.getSoapBody(AbstractSoapMessage.java:36)
    at com.project.my.WebMessageTest.setUp(WebMessageTest.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

【问题讨论】:

  • 你能把完整的堆栈跟踪而不是一行吗?

标签: java spring unit-testing junit mockito


【解决方案1】:

尝试为您的模拟对象添加一个主体,试试这个:

messageContextMock = mock(MessageContext.class);

saajSoapMessageMock = mock(SaajSoapMessage.class);
soapEnvelopeMock = mock(SOAPEnvelope.class);

when(saajSoapMessageMock.getEnvelope()).thenReturn(soapEnvelopeMock);
when(messageContextMock.getRequest()).thenReturn(saajSoapMessageMock);

【讨论】:

  • 还是一样。我用过:messageContextMock = mock(MessageContext.class); saajSoapMessageMock = mock(SaajSoapMessage.class); soapMessageMock = mock(SOAPMessage.class); soapBodyMock = mock(SOAPBody.class); when(soapMessageMock.getSOAPBody()).thenReturn(soapBodyMock); when(saajSoapMessageMock.getSaajMessage()).thenReturn(soapMessageMock); when(messageContextMock.getRequest()).thenReturn(saajSoapMessageMock); when(soapMessageMock.getSOAPBody()).thenReturn(soapBodyMock);
  • 我的回答中有一个错误,我在两个不同的模拟上模拟 getSoapBody() 的返回,其中一个是错误的。我不知道这是否会影响您的结果,但可能值得一试。像你一样获得一个空指针表明某些东西没有被正确地模拟。调试您的测试代码并查看创建的模拟对象。看看 SaajSoapMessage -> SOAPMessage -> SOAPBody 的路径,这些都是空的吗?
  • 所以,nullpointer 在这段代码中:` /** 返回 getEnvelope().getBody()。 */ public final SoapBody getSoapBody() { return getEnvelope().getBody(); }` null 是信封,implementatnion,messageFactory,saajMessage
  • 我在答案中添加了更多模拟,这次它应该模拟 SOAPEnvelope 以及用于从 SOAPMessage 获取信封的 SOAPPart 类。
  • 不幸的是一样。但是对于您的信息,saajSoapMessageMock 只有 getSaajMessage 方法而不是 getSoapMessage 方法。
猜你喜欢
  • 2012-06-29
  • 2017-06-22
  • 2018-11-22
  • 2012-03-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多