【问题标题】:Unexpected method call Exception in powermockpowermock中的意外方法调用异常
【发布时间】:2014-12-15 15:35:29
【问题描述】:

我的项目有以下调用链

Impl.execute() --> Helper.help() --> Proxy.doOperation()

我正在尝试在 PowerMock 和 TestNG 中执行 Impl.execute() 的测试用例。我遇到了异常

execute(ImplTest)  Time elapsed: 0.391 sec  <<< FAILURE!
java.lang.AssertionError: 
Unexpected method call Proxy.doOperation({clientId=123456}, ""):
Proxy.doOperation({}, null): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:94)
at com.xxx.xxx.xxx.sync.services.Proxy$$EnhancerByCGLIB$$1937be76.doOperation(<generated>)
at com.xxx.xxx.xxx.sync.services.helper.Helper.getIdFromClient(Helper.java:39)
at com.xxx.xxx.xxx.sync.services.impl.Impl.execute(Impl.java:97)
at com.xxx.xxx.xxx.sync.services.impl.ImplTest.execute(ImplTest.java:130)

我已经写了下面的代码

@PrepareForTest({ApplicationContextLoader.class,Helper.class})
@PowerMockIgnore({"javax.management.*", "javax.xml.*","org.xml.*","org.w3c.dom.*"})
public class ImplTest extends PowerMockTestCase {

   @ObjectFactory
   /**
    * Configure TestNG to use the PowerMock object factory.
    */
   public IObjectFactory getObjectFactory() {
      return new org.powermock.modules.testng.PowerMockObjectFactory();
   }

@Test
 public void execute() {

Impl impl = new Impl();

    Proxy regProxy = PowerMock.createMock(Proxy.class);
    PowerMock.expectNew(Proxy.class).andReturn(regProxy);   
    expect(regProxy.doOperation(Matchers.anyMap(),Matchers.any(String.class))).andReturn(someString);
    PowerMock.replayAll();
    Assert.assertEquals(impl.execute(request, ""),"");
    PowerMock.verifyAll();
  }

}

请帮助

【问题讨论】:

  • 使用可编译的代码示例更容易回答您的问题。请将您的代码发布为minimal example,以证明您的问题。目前,由于缺少数据(ImplProxy 定义等),我们无法编译。但请不要将大量代码复制/粘贴到您的问题中,花时间为我们创建一个最小的示例。

标签: java unit-testing testng powermock easymock


【解决方案1】:

试试这个

Proxy regProxy = PowerMock.createNiceMock(Proxy.class);

当您在链式方法中执行 EasyMock.createMock() 时,它会失败,因为 Easymock 无法识别此方法将在其他地方调用,但是当我们执行 EasyMock.createNiceMock() 时,模拟不会在此意外方法上失败,并且可以根据需要执行模拟。

事实上,我已经为这个错误苦苦挣扎了大约一个星期,当我找到这个解决方法时,简直是天大的好事。

希望这会有所帮助! 祝你好运!

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @Raptor 看起来像是对我的回答。也许不是一个好的,因为它有点短。但肯定不值得你的罐头评论。
  • @Vihar 请扩展您的答案以解释为什么这是解决 OP 问题的方法。
  • @Raptor 将来会注意发布完整的答案
  • @Vihar 是的,当我使用来自 mockito 的 Matchers 时,期望出现问题,当使用来自 EasyMock 的 anyObject 时解决了问题。感谢您帮助解决原始问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多