从 Mockito when() 返回字符串值



我正在尝试使用 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");

相关内容

  • 没有找到相关文章

最新更新