gpt4 book ai didi

java - 模拟接口(interface)/抽象类时 Mockito InvalidUseOfMatchersException

转载 作者:行者123 更新时间:2023-11-29 03:34:22 27 4
gpt4 key购买 nike

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

Mockito 匹配器是返回虚拟值的静态函数(但会 secret 记录它们与 Mockito 的调用)。在内部,Mockito 保留 a stack of previously-called matchers ,每个线程一个,因此如果您在测试方法的末尾调用 Matcher,它将徘徊以污染同一线程中的下一个测试方法。

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

至于实际的 Matcher 滥用?仔细检查每次使用 org.mockito.Mockitoorg.mockito.Matchers 中的匹配器时,您实际上是在匹配函数中的每个参数;我在 separate SO answer 中查看了原因.在调用 whenverify(这会干扰 Mockito 的静态魔法)或尝试 stub 或验证任何标记为 的方法时,要特别小心调用其他模拟final(它将静默失败,因为 VM 调用实际实现)。

希望对您有所帮助!

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com