从 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 @Mock
s 即可从该框架验证中受益。
无论如何,与 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 书更重要。
我正在尝试使用像
这样的 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 @Mock
s 即可从该框架验证中受益。
无论如何,与 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 书更重要。