2011-02-02 216 views
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方法中不可用的數據。

回答

3

我認爲問題是,你在呼喚你的foo模擬重播兩次,一次是在嘲笑靜態方法getMockInstance(),你告訴嘲笑foo期待的foo.bar(bar1)電話後一次。嘗試改變getMockInstance()

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

,然後告訴EasyMock的重播foo你告訴它期望bar方法調用之後。所以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; 
    } 
+0

謝謝,它的工作。是否可以在不抑制重放的情況下實現同樣的效果(例如,將Foo切換回另一個模式,添加更多模擬物並在最後切換回重放)? – mindas 2011-02-02 13:43:03