我正试图让Mockito中的verify
方法起作用。我有以下测试:
@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 :(得分:6)
嗯,你应该小心:默认情况下,你不能模拟最终的课程(比如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结合使用。
另一方面,String
是java.lang
包的一部分,我假设VM会对这些类进行一些额外的安全验证(但不确定)。我不相信你可以模拟(即操纵字节码)这样的类(例如,如果你试图在java.*
包中放置一些内容,就会出现编译错误)。但这只是我身边的假设。