从 Mockito when() 返回字符串值

Returning String value from the 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.

在这种情况下,我如何 return 指定字符串?

您应该使用多个 when() 拦截:

@Mock Individual indProvider;
@Mock Provider provider;

when(indProvider.asProvider()).thenReturn(provider);
when(provider.getProviderId()).thenReturn("795316051750");

代码中的某个地方可能在存根调用或验证调用之外使用了 mockito Matcher。

如果您的代码库使用 JUnit,我建议使用 mockito runner,它将验证每个测试方法的 mockito 使用,这意味着任何问题都可以查明是测试编写不正确。

@RunWith(MockitoJUnitRunner.class)
public class TheTest {
    @Test public void shoudl_perform_something() { ... }
}

或使用 mockito 规则(自 2017 年 10 月 1 日起)

public class TheTest {
    @Rule MockitoRule mockitoRule = MockitoJUnit.rule();
    @Test public void should_perform_something() { ... }
}

您不必在测试中使用 have @Mocks 即可从该框架验证中受益。 无论如何,与 MockitoAnnotations.initMocks(...)

相比,两者都是 首选 实例化模拟的方法

您使用的是哪个版本的 mockito?我相信 Mockito 改进了一些带有错误代码位置的消息。


请注意,此代码无法正常工作,因为 indProvider.asProvider() 未被存根,因此 mockito 将使用默认值 null。您必须以任何一种方式执行此操作(深度存根在这里用于遗留代码,模拟返回模拟通常被认为是代码味道,它表明测试代码破坏了 Law of Demeter):

@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 书更重要。