1

我最近在我的项目中将 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);
4

1 回答 1

4

InvalidUseOfMatchersException几乎从来不是由调用引起的Mockito.mock();相反,调用 toMockito.mock()告诉 Mockito验证它不在某事的中间,这是它确定它应该抛出一个InvalidUseOfMatchersException. 您的错误可能与 Maven/Surefire 有关,因为它以与 Eclipse 不同的顺序执行您的测试方法,或者因为 Maven 正在重用 Eclipse 没有的 JVM。

Mockito 匹配器是返回虚拟值的静态函数(但会秘密地使用 Mockito 记录它们的调用)。在内部,Mockito 保留了一堆先前调用的matchers ,每个线程一个,所以如果你在测试方法结束时调用 Matcher ,它将徘徊在同一个线程中污染下一个测试方法。

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

至于实际的 Matcher 滥用?仔细检查每次使用org.mockito.Mockitoor中的 Matcher 时org.mockito.Matchers,您实际上匹配了函数中的每个参数;我在一个单独的 SO 答案中讨论了原因。when在调用or中调用其他模拟时要特别小心verify(这会干扰 Mockito 的静态魔法),或者在尝试存根或验证任何标记的方法时final(这将静默失败,因为 VM 调用了实际的实现)。

希望有帮助!

于 2013-05-02T05:44:20.067 回答