2012-03-04 69 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