![](/img/trans.png)
[英]Mockito throws InvalidUseOfMatchersException while mocking a method
[英]Mockito InvalidUseOfMatchersException while mocking an Interface/Abstract class
我最近在我的项目中将Maven Surefire插件升级到版本v2.14.1(从v2.6开始)。 在此次升级之后,Mockito开始在所有JUnit测试中抛出InvalidUseOfMatchersException,其中在“接口”或“抽象类”上调用Mockito.mock()方法。 通过Eclipse执行相同的单元测试工作正常,但在使用Maven构建时总是失败。
Here are few examples of calls that are failing:
i) DataSource dataSource = Mockito.mock(DataSource.class);
ii) DatabaseMetaData metaData = mock(DatabaseMetaData.class);
iii) ResultSet rs = mock(ResultSet.class);
InvalidUseOfMatchersException
几乎从不是由对Mockito.mock()
的调用引起的; 相反,对Mockito.mock()
的调用告诉Mockito 验证它不在某事物的中间 ,这是因为它确定它应该抛出InvalidUseOfMatchersException
。 您的错误可能与Maven / Surefire有关,因为它以与Eclipse不同的顺序执行您的测试方法,或者因为Maven正在重用Eclipse不在的JVM。
Mockito匹配器是静态函数,它返回虚拟值(但是用Mockito秘密记录它们的调用)。 在内部,Mockito保留了一堆先前称为匹配器的堆栈 ,每个线程一个,因此如果在测试方法结束时调用Matcher,它将会在同一个线程中徘徊以污染下一个测试方法。
解决此问题的最简单方法是在tearDown
方法(JUnit3)或@After
方法(JUnit4)中调用Mockito.validateMockitoUsage()
)。 这将导致误用Mockito的测试方法在那里失败,而不是在下一个运行的方法中。
至于实际的Matcher滥用? 仔细检查每次使用org.mockito.Mockito
或org.mockito.Matchers
的Matcher时,您实际上是在匹配函数中的每个参数; 我在一个单独的答案中回答了原因。 特别警惕从你的调用中调用其他模拟when
或verify
(这会干扰Mockito的静态魔法)或者尝试存根或验证任何标记为final
方法(由于VM调用实际的实现而无声地失败)。
希望有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.