模拟接口/抽象类时Mockito InvalidUseOfMatchersException

时间:2013-05-01 20:00:09

标签: java maven mockito surefire

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

1 个答案:

答案 0 :(得分:4)

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,它会四处乱窜,污染同一个线程中的下一个测试方法。

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

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

希望有所帮助!