2012-05-25 75 views
3

以下是我的課如何使用PowerMock部分模擬公共方法?

public class SomeClass { 
    public ReturnType1 testThisMethod(Type1 param1, Type2 param2) { 
     //some code 
     helperMethodPublic(param1,param2); 
     //more code follows 
    } 

    public ReturnType2 helperMethodPublic(Type1 param1, Type2 param2) { 
     //some code    
    } 
} 

所以在上面的類在測試testThisMethod(),我想部分模擬helperMethodPublic()。

截至目前,我做了以下內容:

SomeClass someClassMock = 
    PowerMock.createPartialMock(SomeClass.class,"helperMethodPublic"); 
PowerMock.expectPrivate(someClassMock, "helperMethodPublic, param1, param2). 
    andReturn(returnObject); 

編譯器不抱怨。所以我嘗試運行我的測試,當代碼碰到helperMethodPublic()方法時,控件進入方法並開始執行那裏的每行代碼。我如何防止這種情況發生?

回答

8

不依賴於一個模擬的框架,另一個解決方案是在您的測試中定義一個匿名子類覆蓋「helperMethodPublic」:

SomeClass sc = new SomeClass() { 
    @Override 
    public ReturnType2 helperMethodPublic(Type1 p1, Type2 p2) { 
     return returnObject; 
    } 
}; 

然後,當您在測試中使用這種情況下,它將運行'testThisMethod'的原始版本和'helperMethodPublic'的覆蓋版本

+0

是這個工程,我這樣做,到現在爲止。但是,由於我使用的框架已經對私人幫手方法進行了部分嘲諷,因此必須有辦法部分嘲笑公共幫手方法嗎? – maverick

+0

謝謝你,這是我遇到的類似問題的完美解決方案。我永遠不會擁有這種輝煌的技術! –

1

我想這是因爲你的「helperMethodPublic」不是私有方法(如在PowerMock.expectPrivate中)。 PowerMock是一個框架,它擴展了其他模擬框架來添加諸如模擬私有和靜態方法(JMock,Mockito等不能處理)的東西。做一個公共方法的部分模擬應該是你的基礎模擬框架處理的東西。

4

我認爲這是因爲傑夫說的。

試試這個 - 建立一個預期,就像任何其他模擬的方法:

SomeClass someClassMock = PowerMock.createPartialMock(SomeClass.class, 
                 "helperMethodPublic"); 

EasyMock.expect(someClassMock.helperMethodPublic(param1, param2)). 
    andReturn(returnObject); 

PowerMock.replayAll(); 
相關問題