我最近在项目中将Maven Surefire插件升级到了v2.14.1版本(从v2.6版本开始)。升级之后,Mockito开始在所有在“接口”或“抽象类”上调用Mockito.mock()方法的JUnit测试中引发InvalidUseOfMatchersException。通过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告知validate that it's not in the middle of something,这是它确定应抛出InvalidUseOfMatchersException的时间。您的错误可能与Maven / Surefire有关,因为它以与Eclipse不同的顺序执行测试方法,或者因为Maven在不使用Eclipse的情况下重用了JVM。

Mockito匹配器是返回伪值的静态函数(但会秘密地使用Mockito记录其调用)。在内部,Mockito保持每个线程一个a stack of previously-called matchers,因此,如果在测试方法的末尾调用Matcher,它将徘徊在同一线程中污染下一个测试方法。

最简单的方法是在Mockito.validateMockitoUsage()方法(JUnit3)或tearDown方法(JUnit4)中对@After进行调用。这将导致滥用Mockito的测试方法在那里失败,而不是在运行的任何下一方法中失败。

至于实际的Matcher滥用?仔细检查每次使用org.mockito.Mockitoorg.mockito.Matchers中的Matcher时,实际上都在匹配函数中的每个参数。我在separate SO answer中详细说明了原因。尤其要警惕从您对whenverify的调用中调用其他模拟(这会干扰Mockito的静态魔术),或者在尝试存根或验证任何标记为final的方法时(由于VM调用实际执行)。

希望有帮助!

关于java - 模拟接口(interface)/抽象类时出现Mockito InvalidUseOfMatchersException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16325523/

10-14 10:13