[英]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.