我最近在我的项目中将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);
答案 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.Mockito
或org.mockito.Matchers
的匹配器时,您实际上是匹配函数中的每个参数;我在separate SO answer中查明了原因。特别警惕在调用when
或verify
(干扰Mockito的静态魔法)时或在尝试存根或验证标记为final
的任何方法时调用其他模拟(这将失败)默默地,因为VM调用实际的实现)。
希望有所帮助!