2014-10-18 217 views
0

我有一個像下面這樣的函數。如何查找靜態函數被調用的次數Mockito

public String getDecodedToken() throws UnsupportedEncodingException { 
    if (token == null) { 
     String token = ClassContainingStatic 
       .findString("static"); 
     this.token = new String(Base64.decodeBase64(token), "UTF-8"); 
    } 
    return token; 
} 

爲了測試函數,我不想模擬ClassContainingStatic類,因爲它會渲染測試無用。相反,我希望看到如果該調用發生在ClassContainingStatic.findString(「static」)而不嘲笑該對象。有沒有辦法實現對真實對象的函數調用次數?

+0

可能你應該用'doCallRealMethod'嘲笑你的類嗎? – 2014-10-18 17:50:46

回答

1

當然可能有一點重構。如果提取調用靜態類在一個單獨的方法:

public String getDecodedToken() throws UnsupportedEncodingException{ 
    if(token == null){ 
    token = createToken(); 
    } 
    return token; 
} 

String createToken() throws UnsupportedEncodingException{ 
    String token = ClassContainingStatic.findString("static"); 
    return new String(Base64.decodeBase64(token), "UTF-8"); 
} 

現在你可以創建一個模擬或間諜,並簡單地驗證該方法是否被調用。

ClassUnderTest spy = Mockito.spy(new ClassUnderTest()); 
String token = spy.getDecodedToken(); 
Mockito.verify(spy).createToken(); 

我認爲"static"字符串是固定的。如果不是,則將其作爲參數傳遞給createToken類,然後您可以相應地調整verify

我可能在Mockito語法中犯了錯誤,但總體思路應該清楚。唯一的缺點是您需要創建一個可見/受保護的包(如果需要,甚至是公開的,但通常情況並非如此),以便撥打verify

+0

如果有人將對ClassContainingStatic.findString(「static」)的調用更改爲「SomeOtherClassContainingStatic.findString(」static「)',那麼這將超出測試的目的,測試仍然會成功。 – 2014-10-18 19:36:52

+0

另外,因爲我對單元測試非常陌生,所以還有另外一個問題。我們應該嘲笑受測試的班級。通常我看到人們通常會聲明一個私有變量(比如'private ClassUnderTest classUnderTest'),然後在'setUp()'中他們會執行'classUnderTest = new ClassUnderTest'。對於新問題,兩個 – 2014-10-18 19:38:17

+0

@AmanDeepGautam之間可能會有什麼區別,請提出一個新問題。 – 2014-10-20 07:05:11

1

你需要的基本東西就是Mockito語言中的間諜。

雖然模擬是一個全新的對象,但間諜軟件會覆蓋現有實例,並默認將其方法調用轉發給原始對象,同時支持模擬方法調用或驗證調用。

但是你有另一個挑戰:你想驗證的方法似乎是一個靜態方法。用Mockito你不能嘲笑靜態方法。你有兩個基本的選擇:

  1. 重構,使該方法不再是靜態的,你提供哪些主機的方法上作爲參數傳遞給構造函數的對象。這個參數可以是模擬或間諜。

  2. 使用PowerMock來模擬靜態方法。我只接受在傳統項目中使用PowerMock,在那裏需要儘可能少的重構來創建測試。 PowerMock非常笨拙,速度很慢,並且容易導致在路上出現問題,例如,通過在飛行中創建許多類來導致PermGen問題。