2016-08-17 137 views
0

我正在junit上使用PowerMockRunner來模擬靜態方法。JUnit:攔截方法調用,然後調用不同的參數

我知道靜態方法可以使用when(...).thenReturn(...)

被嘲笑我需要模擬一定的方法,該方法有四個參數:

public static void addInputPath(String, Boolean, Integer, Double) 

我需要第三個參數(整數)在任何調用此方法將被替換爲10。所有其他參數應該按原樣傳遞。

換句話說,我需要做的是這樣的:

when(addInputPath(str, bool, intgr, dbl)).thenReturn(addInputPath(str, bool, 10, dbl)); 

有沒有辦法做到這一點?

+0

此線程回答此問題: http://stackoverflow.com/questions/5462096/stubbing-a-method-that-takes-classt-as-parameter-with-mockito – kolakao

+0

我不相信你可以替換一個參數,你可以做的是給你的方法的返回值給定的參數 –

+0

@kolakao不知道這是我想要的。簡化我的問題。 –

回答

0

所以,當我得到你的要求的權利,你真正想要做的是攔截調用addInputPath()並調用它與一個不同的參數?

如果是這樣的話:我不確定這是否可以用任何模擬框架完成(我懷疑它是可能的)。嘲笑框架大約是嘲諷調用;而不是關於儀表/攔截呼叫。

回到你的問題,這是一個很好的例子,爲什麼靜態調用太頻繁導致問題。因此,我眼中最好的解決方案是改變你的方法xyz(),以避免直接調用addInputPath()。就像這樣:

interface InputPathAdder { 
    void addInputPath(str, ...); 
} 

class ForwardingInputPathAdder implements InputPathAdder { 
    // implements the method by calling the static method 

和突然,你也可以這樣做:

class ForwardingInputPathAdderWithFixedIntegerParm implements InputPathAdder { 
    // implements the method by calling the static method, but using 10 always 

(顯然,命名可以在這裏提高)

現在:你使用依賴注入給你的「正在測試的類」一些對象實現InputPathAdder。這可能是一個完全嘲笑測試的人;或者它可能只是一個轉發(在您的生產環境中;或者它可能是修復第三個參數的那個)。而且不需要嘲笑你的「攔截」情況。