2012-03-04 74 views
5

我試圖讓Mockito中的verify方法正常工作。我有以下測試:Mockito驗證不失敗

@Test 
public void testShouldFail() 
{ 
    String string = mock(String.class); 
    string.length(); 
    verify(string, times(100)).length(); 
} 

此測試應該失敗,但它通過。有人知道爲什麼嗎?我使用Mockito錯了嗎?

更新

下面是不會失敗的另一個例子:

private interface Bar 
{ 
    public void foo(); 
} 

@Test 
public void testShouldFail() 
{ 
    Bar bar = mock(Bar.class); 
    bar.foo(); 
    verify(bar, times(100)).foo(); 
} 
+0

你是第二個例子,當測試失敗時,你能否提供更多的細節? – 2012-03-04 14:34:53

回答

5

那麼,你應該小心的是:在默認情況下,你不能嘲笑final類(如String) 。框架的This is a known limitation

你的榜樣,我無法用正確的錯誤消息:

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class java.lang.String 
Mockito cannot mock/spy following: 
    - final classes 
    - anonymous classes 
    - primitive types 
    at Test.testShouldFail(Test.java:6) 
     ... 

所以我猜有可能是在你的項目中一些小的配置問題。你在使用哪個IDE?你有哪個版本的Mockito?你如何運行你的測試?

你可以嘗試使用一些額外的工具包,如PowerMock,它可以幫助你overcome this limitation。這個框架可以很容易地與Mockito結合使用。

另一方面,Stringjava.lang包的一部分,我假設有一些額外的安全驗證涉及這些類的VM(不知道如何)。我不相信你可以模擬(即操縱字節碼)這樣的類(例如,如果你試圖在java.*包中加入某些東西,你會得到編譯錯誤)。但這只是我的一個假設。

+0

老實說,我剛剛使用'String'作爲一個簡單的例子。不過,知道Mockito有這個限制是很好的。我用另一個不失敗的例子更新了我的問題。我使用的是Eclipse Indigo和Junit 4.8.2,Mockito 1.9.0和PowerMock 1.4.11。 – LandonSchropp 2012-03-04 09:29:04

+0

您能否包括您所做的完整測試課程,包括進口指令?你確定你已經將所需的JAR文件添加到你的項目中了嗎? – rlegendi 2012-03-04 10:05:31

+0

對不起,延遲迴復。看起來你是對的。當我添加PowerMock時,我搞亂了我的Mockito庫。請更新您的答案,以便我可以檢查它。謝謝您的幫助。 – LandonSchropp 2012-03-07 06:55:12