1
靜態和動態兩種方法
比方說,我們有懲戒與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
方法中不可用的數據。
謝謝,它的工作。是否可以在不抑制重放的情況下實現同樣的效果(例如,將Foo切換回另一個模式,添加更多模擬物並在最後切換回重放)? – mindas 2011-02-02 13:43:03