我最近在我的项目中将Maven Surefire插件升级到v2.14.1版本(从v2.6)。在这次升级之后,mockitto开始在所有JUnit测试中抛出InvalidUseOfMatchersException,其中在"接口"或"抽象类"上调用mockitto .mock()方法。同样的Unit Test在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验证它不在某物的中间,这是当它确定它应该抛出InvalidUseOfMatchersException
时。您的错误可能与Maven/Surefire有关,因为它以与Eclipse不同的顺序执行您的测试方法,或者因为Maven重用了Eclipse没有使用的JVM。
Mockito匹配器是返回虚拟值的静态函数(但会秘密地用Mockito记录它们的调用)。在内部,Mockito保留了先前调用的匹配器的堆栈,每个线程一个,所以如果你在测试方法结束时调用匹配器,它会在同一线程中污染下一个测试方法。
确定这一点的最简单方法是在tearDown
方法(JUnit3)或@After
方法(JUnit4)中调用Mockito.validateMockitoUsage()
。这将导致错误使用Mockito的测试方法在这里失败,而不是在下一个运行的方法中失败。
至于实际的Matcher误用?仔细检查每次使用org.mockito.Mockito
或org.mockito.Matchers
中的Matcher时,您实际上匹配了函数中的每个参数;我在一个单独的SO回答中解释了原因。在调用when
或verify
时,要特别小心调用其他mock(这会干扰Mockito的静态魔力),或者在尝试存根或验证任何标记为final
的方法时(这会无声地失败,因为VM会调用实际实现)。
希望有帮助!