从Mockito返回字符串值when()

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

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

@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.

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

k3fezbri

k3fezbri1#

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

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

或使用mockito规则(自1.10.17起)

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

您不必在测试中使用havex 1 m0n1x来从这个框架验证中获益,而且无论如何,与MockitoAnnotations.initMocks(...)相比,这两种方法都是示例化模拟的 * 首选 * 方式
还有,您使用的是哪个版本的mockito?我相信Mockito已经改进了一些错误代码位置的消息。
请注意,这段代码无法正常工作,因为indProvider.asProvider()没有存根,所以mockito将使用默认值null。您必须以任何一种方式执行此操作(深层存根用于遗留代码,返回mock的mock通常被视为代码气味,它显示测试代码破坏了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),它是你能读到的关于编写测试指导的软件的最好的书之一,我发现它甚至比臭名昭著的有效Java书更重要。

ttygqcqt

ttygqcqt2#

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

@Mock Individual indProvider;
@Mock Provider provider;

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

bt1cpqcv3#

您可以按如下方式求解:

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

相关问题