2013-02-01 127 views
27

我設置了嘲諷一個類的靜態方法真正的方法。我必須在@Before-annotated JUnit設置方法中執行此操作。PowerMock,嘲笑一個靜態方法,然後調用所有其他靜態

我的目標是設置該類以調用真實方法,(除了)用於我明確模擬的那些方法。

基本上:

@Before 
public void setupStaticUtil() { 
    PowerMockito.mockStatic(StaticUtilClass.class); 

    when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); // mock out certain methods... 

    // Now have all OTHER methods call the real implmentation??? How do I do this? 
} 

我運行到的問題是,內StaticUtilClass方法public static int someStaticMethod(String s)如果與null值供給不幸拋出一個RuntimeException

所以我不能簡單地去調用真正的方法,如下列的預設答案的明顯途徑:

@Before 
public void setupStaticUtil() { 
    PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods 

    // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null! 
    // Even though I don't actually want to call the method, I just want to setup a mock result 
    when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
} 

我需要設置默認的回答來呼籲所有其他靜態方法後真正的方法我嘲笑我對嘲笑感興趣的方法的結果。

這可能嗎?

回答

50

你在尋找被稱爲部分嘲諷

在PowerMock中,您可以使用mockStaticPartial方法。

在PowerMockito你可以使用存根,這將只存根定義的方法,並留下其他不變:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5); 

也不要忘了

@PrepareForTest(StaticUtilClass.class) 
+0

我沒有看到無論是我的PowerMockito類中的stub()或mockStaticPartial()方法。版本1.5。在我的版本1.9.5類的Mockito,我看到一個存根()方法在這裏:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#stub(T),但是讀我發現文檔這樣的:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#when(T),其中指出,**當()是過時存根(對象)**的繼任者,所以我不要以爲這種方法已經被使用了,並且不會按照我的需要去做。 –

+0

mockStaticPartial被定義爲EasyMock的 - 我沒有聽清楚,你是明確要求的Mockito - http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/easymock/PowerMock。 html – zibi

+1

存根在MemberModifier中定義,它是PowerMockito的超類 - 它就在那裏! - http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/support/membermodification/MemberModifier.html#stub%28java.lang.reflect.Method%29 – zibi