我正在尝试使用 when() 方法在 mockito 中指定字符串值,例如
@Mock Individual indProvider;
when(indProvider.asProvider().getProviderId()).thenReturn("795316051750");
但我得到了例外
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
For more info see javadoc for Matchers class.
在这种情况下,如何返回特定的字符串?
代码中的某个地方可能在存根调用或验证调用之外使用了 mockito Matcher。
如果您的代码库使用 JUnit,我建议使用 mockito 运行器,它将验证每个测试方法使用的 mockito,这意味着任何问题都可以精确定位到错误编写的测试中。
@RunWith(MockitoJUnitRunner.class)
public class TheTest {
@Test public void shoudl_perform_something() { ... }
}
或者使用模拟规则(自 1.10.17 起)
public class TheTest {
@Rule MockitoRule mockitoRule = MockitoJUnit.rule();
@Test public void should_perform_something() { ... }
}
无需在测试中使用 have @Mock
即可从此框架验证中受益。无论如何,与MockitoAnnotations.initMocks(...)
相比,两者都是实例化模拟的首选方法
另外,您使用的是哪个版本的模拟?我相信 Mockito 已经改进了一些带有错误代码位置的消息。
请注意,此代码无法正常工作,因为indProvider.asProvider()
没有存根,因此 mockito 将使用默认值 null
。无论哪种方式,您都必须这样做(深层存根在这里用于遗留代码,返回模拟的模拟通常被认为是代码异味,它表明测试的代码违反了得墨忒耳定律):
@Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider;
// ...
when(indProvider.asProvider().getProviderId()).thenReturn("795316051750");
或者正如@przemek所回答的那样,它更冗长,并且在测试的代码中显示出相同的弱点。
@Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider;
@Mock Provider provider;
// ...
when(indProvider.asProvider()).thenReturn(provider);
when(provider.getProviderId()).thenReturn("795316051750");
我建议你阅读这本书(Growing Object Oriented Software Guided by Tests),这是你能读到的关于编写由测试引导的软件的最好的书之一。我发现它甚至比臭名昭著的Effective Java书更重要。
您应该使用多个when()
拦截:
@Mock Individual indProvider;
@Mock Provider provider;
when(indProvider.asProvider()).thenReturn(provider);
when(provider.getProviderId()).thenReturn("795316051750");
你可以这样解决它:
Mockito.when(indProvider.asProvider().getProviderId())
.thenAnswer(t -> "795316051750");