从Mockito返回字符串值when()

ltqd579y  于 2023-03-02  发布在  其他
关注(0)|答案(3)|浏览(520)

我尝试使用when()方法在mockito中指定String值,如

  1. @Mock Individual indProvider;
  2. when(indProvider.asProvider().getProviderId()).thenReturn("795316051750");

但我有例外

  1. org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
  2. Invalid use of argument matchers!
  3. 0 matchers expected, 1 recorded.
  4. This exception may occur if matchers are combined with raw values:
  5. //incorrect:
  6. someMethod(anyObject(), "raw String");
  7. When using matchers, all arguments have to be provided by matchers.
  8. For example:
  9. //correct:
  10. someMethod(anyObject(), eq("String by matcher"));
  11. For more info see javadoc for Matchers class.

在这种情况下,如何返回特定的String?

k3fezbri

k3fezbri1#

代码中可能有一个mockito Matcher在存根调用或验证调用之外使用。
如果您的代码库使用JUnit,我建议使用mockito runner,它将验证每个测试方法使用的mockito,这意味着任何问题都可以被精确定位到编写错误的测试。

  1. @RunWith(MockitoJUnitRunner.class)
  2. public class TheTest {
  3. @Test public void shoudl_perform_something() { ... }
  4. }

或使用mockito规则(自1.10.17起)

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

您不必在测试中使用havex 1 m0n1x来从这个框架验证中获益,而且无论如何,与MockitoAnnotations.initMocks(...)相比,这两种方法都是示例化模拟的 * 首选 * 方式
还有,您使用的是哪个版本的mockito?我相信Mockito已经改进了一些错误代码位置的消息。
请注意,这段代码无法正常工作,因为indProvider.asProvider()没有存根,所以mockito将使用默认值null。您必须以任何一种方式执行此操作(深层存根用于遗留代码,返回mock的mock通常被视为代码气味,它显示测试代码破坏了Law of Demeter):

  1. @Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider;
  2. // ...
  3. when(indProvider.asProvider().getProviderId()).thenReturn("795316051750");

或者如@przemek所回答的那样,它更冗长,并且在测试代码中显示出相同的弱点。

  1. @Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider;
  2. @Mock Provider provider;
  3. // ...
  4. when(indProvider.asProvider()).thenReturn(provider);
  5. when(provider.getProviderId()).thenReturn("795316051750");

我建议你读这本书(Growing Object Oriented Software Guided by Tests),它是你能读到的关于编写测试指导的软件的最好的书之一,我发现它甚至比臭名昭著的有效Java书更重要。

展开查看全部
ttygqcqt

ttygqcqt2#

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

  1. @Mock Individual indProvider;
  2. @Mock Provider provider;
  3. when(indProvider.asProvider()).thenReturn(provider);
  4. when(provider.getProviderId()).thenReturn("795316051750");
bt1cpqcv

bt1cpqcv3#

您可以按如下方式求解:

  1. Mockito.when(indProvider.asProvider().getProviderId())
  2. .thenAnswer(t -> "795316051750");

相关问题