2011-12-08 86 views
3

我有一個類有這樣的例子中的一些方法。如何用PowerMock測試一個從同一個類中調用另一個private void方法的方法?

public class TestClass { 

    public boolean aMethod() 
    { 
     voidMethod(); 
     return true; 
    } 

    private void voidMethod() 
    { 
     ... does something ... 
    } 

    ... other methods ... 
} 

我想測試aMethod與powermock和所有方法應該除了voidMethod正常工作。 我創建了一個TestClass的部分模擬,以使voidMethod什麼都不做。但我不知道如何期待這種方法的調用。

testObject = createPartialMock(TestClass.class, "voidMethod"); 
expectPrivate(testObject, "voidMethod"); 

我得到的第二行的錯誤:

在類型EasyMock的方法,期望(T)是不適用的參數(無效)

哪有我解決了這個問題?

回答

2

使用簡單的調用是這樣的:

testObject.voidMethod(); // don't use "expect" for voids 
expectLastCall().times(3); // use this for expectations 

並運行測試代碼後,不要忘了你的期望後reply()verify()

+0

對不起,我有一個錯誤,但它不會改變behavior.voidMethod從aMethod調用,它是一個私人方法。任何我希望從aMethod.If調用voidMethod甚至voidMethod將公開,無論testObject.voidMethod();涉及到我的測試aMethod? – shift66

+0

由於voidMethod()是私有的,所以這個答案永遠不會工作,它甚至不會編譯。 –

2

它看起來像PowerMock不能嘲笑一個私人無效的方法(只有返回值的私人方法)。他們應該真的提供一個更有用的編譯器錯誤來明確說明這一點。 EasyMock根本不嘲笑私有方法。 @ StanislawLeventhal的答案引用了使用EasyMock期望(記錄)調用非私有無效方法的語法。

你應該先做的是考慮你所做的事情是否合理,以及真正需要嘲笑的東西。當你嘲笑私有方法時,考慮它是一種代碼味道;也許你需要這樣做,但通常情況下,有一種方法可以避免它。批判性地思考你爲什麼在嘲笑,這聽起來很明顯,但很容易混淆和錯過。

爲什麼你應該在你的測試類中有一個私有方法,你不能直接調用,而需要模擬,而不是返回一個值?嘲笑通常用於控制從方法返回的內容;在這裏,你基本上是說這個方法必須被調用,但是你希望沒有任何東西覆蓋它的實現(如果我理解正確的話)。我不確定我能否想到在測試課中這對於有用或必需的情況。你提供的例子過於籠統,無法理解背後的推理,但你應該嘗試看看是否有更好的方法來實現你的目標。

+0

如果這回答了這個問題,你會介意將它標記爲答案嗎? – hotshot309

+0

我最初提出了這個答案,但一天後,我重新審視了這個問題,我無法複製它。除了例外,什麼shift66問似乎爲我工作。 – Matt

相關問題