【问题标题】:How to mock this method using EasyMock and PowerMock?如何使用 EasyMock 和 PowerMock 模拟此方法?
【发布时间】:2016-01-19 06:08:38
【问题描述】:

我有这样的方法:

public Object method() {
  Object1 object1 = new Object1();
  return object2.someMethod(object1);
}

现在我的假设是:

public void methodTest() {
  Object1 object1 = EasyMock.createMock(Object1.class);
  PowerMock.expectNew(Object1.class).andReturn(object1);

  Object2 result = new Object2();
  EasyMock.expect(object.someMethod(object1)).andReturn(result);
  EasyMockHelper.replayMocksFor(this);
  result = myTestClass.method();
  EasyMockHelper.verifyMocksFor(this);
}

我收到一个错误,期望方法与被调用的方法不匹配。它期望 object1 的 EasyMock 类被传递给 object.someMethod() 但得到的是 object1 的非模拟类。

希望这是有道理的,并提前感谢您的帮助。

添加一些半实数代码:

public Object1 methodToTest(Object2 someParameter) {
    Object3 object3 = new Object3();
    object3.setSomeMethod(EnumObject1.FOO);
    return object4.getSometMethod(object5, someParameter, EnumObject2.BAR, object3).getSomeMethod(); 
}

object4 和 object5 在类中都是自动连接的。

【问题讨论】:

  • 不要混合使用 PowerMock 和 EasyMock
  • 上面的代码正确吗?您如何在method 中获得object2 和在methodTest() 中的object?
  • object2 是自动装配的,object 是被模拟的类中的一个实例变量。

标签: java unit-testing powermock easymock


【解决方案1】:

你可以这样做:

EasyMock.expect(object.someMethod(EasyMock.isA(Object1.class)).andReturn(result);

这将模拟Object1 类型的任何对象。所以它会为你工作。

在这种情况下,您不需要使用以下代码:

Object1 object1 = EasyMock.createMock(Object1.class);
PowerMock.expectNew(Object1.class).andReturn(object1);

【讨论】:

  • 所以我的 object.someMethod() 实际上有 2 个参数,一个是 Object1.class,另一个是模拟对象,我得到一个 IllegalStateException 说预期 2 个匹配器,1 个记录。如果我将两个参数都转换为匹配器,那么我会得到一个意外的方法调用异常,其中参数与实际的方法调用不匹配。
  • 老兄,它对我有用。请再检查一次,你可能错过了什么。或者请插入您的整个测试代码。
  • 添加一些反映逻辑的混淆代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多