java - 使用 PowerMock 模拟静态和动态方法

标签 java mocking easymock powermock

假设我们有

public class Foo {
   public static Foo getInstance() {...}

   public Bar bar(Baz baz) {...}
}

我想做的是在我的单元测试中模拟它。我需要模拟一个类的静态和动态方法 Foo . mock getInstance()就这么简单

import static org.powermock.api.easymock.PowerMock.replace;
import static org.powermock.api.easymock.PowerMock.method;

public class MyTest {

   @Test
   public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));
   }

   public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      EasyMock.replay(foo);
      return foo;
   }
}

问题是,如何模拟bar方法?

上一个技巧 replace(method(...)).with(method(...))不起作用,因为它不是为动态方法设计的。

尝试在已经模拟的类之上模拟也不起作用:

...
@Test
public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));

      Foo foo = Foo.getInstance();  // works well
      Baz baz1 = new Baz();
      Baz baz2 = new Baz();
      EasyMock.expect(foo.bar(baz1)).andReturn(baz2);  // exception thrown
      EasyMock.replay(foo);
}
...

上面的代码抛出 AssertionError: Unexpected method call bar .

那么我该怎么做呢?我不想 mock .bar(...)进入getMockInstance因为在现实世界中,我需要一些静态 getMockInstance 中无法获得的数据方法。

最佳答案

我认为问题在于您在模拟的 foo 上调用重播两次,一次是在模拟的静态方法 getMockInstance() 中,一次是在您告诉模拟的 foo 期待 foo.bar(bar1) 调用。尝试将 getMockInstance() 更改为

   public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      return foo;
   }

然后告诉 EasyMock 在您告诉它期待 bar 方法调用后重播 foo。所以 MyTest.java 看起来像这样:

@Test
public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));

      Foo foo = Foo.getInstance();  // works well
      Baz baz1 = new Baz();
      Baz baz2 = new Baz();
      EasyMock.expect(foo.bar(baz1)).andReturn(baz2);  // exception thrown
      EasyMock.replay(foo);
}

  public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      return foo;
   }

关于java - 使用 PowerMock 模拟静态和动态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874992/

相关文章:

java - 想要从第一个到最后一个元素。但最后回到第一

python - 如何模拟 ManyToMany 字段?

java - 如何更改 Mockito 中字符串的默认返回值?

javascript - 在 AngularJS Controller 规范中测试来自服务的回调

java - 使用 junit 和 easymock 持久保存模拟对象

java - 将随机值模拟到对象中

java - jackson 解析javascript函数

java - com.sun.xml.bind.v2.runtime.IllegalAnnotationsException : 2 counts of IllegalAnnotationExceptions

unit-testing - 使用 CDI Unit 和 EasyMock 进行单元测试

java - 防止并发插入中的句点交叉