簡體   English   中英

使用PowerMock模擬靜態和動態方法

[英]Mocking both static and dynamic methods with PowerMock

假設我們有

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

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

我想做的是在我的單元測試中模擬它。 我需要模擬Foo類的靜態和動態方法。 模擬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

那我該怎么做? 我不想將.bar(...)getMockInstance放到getMockInstance因為在現實世界中,我需要一些靜態getMockInstance方法中不可用的數據。

我認為問題在於您在foo模擬上調用了兩次重播,一次是在模擬的靜態方法getMockInstance() ,一次是在告訴foo.bar(bar1) 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;
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM