繁体   English   中英

模拟接口/抽象类时Mockito InvalidUseOfMatchersException

[英]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.Mockitoorg.mockito.Matchers的Matcher时,您实际上是在匹配函数中的每个参数; 我在一个单独的答案中回答了原因。 特别警惕从你的调用中调用其他模拟whenverify (这会干扰Mockito的静态魔法)或者尝试存根或验证任何标记为final方法(由于VM调用实际的实现而无声地失败)。

希望有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM