我使用maven和junit 4.5,mockito 1.7
如果右键单击TestCaseA.java中的代码,请选择"运行为" - " Junit测试"没关系。
但是,如果我右键单击TestCaseA.java的父包,请选择"运行为" - " Junit测试",它将失败:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
检测到错位的参数匹配器!在此之前的某个地方你可能误用了Mockito争论匹配器。
例如,您可能在验证或存根之外使用了anyObject()参数匹配器。以下是正确使用参数匹配器的示例:when(mock.get(anyInt()))。thenReturn(null); doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject());验证(模拟).someMethod(含有("富&#34));在testCaseA.setUP(testCaseA.java:33)
public TestCaseA{
SomeService service;
@Mock
private CommonService commonService;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);***//it said this is error***
}
@Test
public void testvalidate() {
//fail even here is empty
}
答案 0 :(得分:1)
这通常是因为你在其他一些测试用例中left a matcher on the matcher stack。 Mockito匹配器实际上是通过副作用工作的,因此不同的测试用例会污染您的测试环境。
使用@RunWith(MockitoJUnitTestRunner.class)
在其他测试类前面添加一个方法,或者为每个测试类添加一个如下所示的方法:
@After
public void checkMockito() {
Mockito.validateMockitoUsage();
}
......无论如何,这就是MockitoJUnitTestRunner所做的,以及为你调用initMocks(this)
。此时,您的一个其他测试用例将失败,并且您将更加幸运地单独调试它。在其他测试用例中,很有可能存在或验证final
方法。有关更多上下文或查看更多调试提示,请参阅上面链接的"How do Mockito matchers work?"。