我最近在项目中将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.Mockito
或org.mockito.Matchers
中的Matcher时,实际上都在匹配函数中的每个参数。我在separate SO answer中详细说明了原因。尤其要警惕从您对when
或verify
的调用中调用其他模拟(这会干扰Mockito的静态魔术),或者在尝试存根或验证任何标记为final
的方法时(由于VM调用实际执行)。
希望有帮助!
关于java - 模拟接口(interface)/抽象类时出现Mockito InvalidUseOfMatchersException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16325523/