Java 从Mockito when()返回字符串值

Java 从Mockito when()返回字符串值,java,unit-testing,mockito,Java,Unit Testing,Mockito,我试图在mockito中使用when方法指定字符串值,如 @Mock Individual indProvider; when(indProvider.asProvider().getProviderId()).thenReturn("795316051750"); 但我有个例外 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 0 matchers

我试图在mockito中使用when方法指定字符串值,如

@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.
在这种情况下,如何返回特定字符串?

拦截时应使用多个:

@Mock Individual indProvider;
@Mock Provider provider;

when(indProvider.asProvider()).thenReturn(provider);
when(provider.getProviderId()).thenReturn("795316051750");
拦截时应使用多个:

@Mock Individual indProvider;
@Mock Provider provider;

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

代码中可能有一个mockito匹配器,用于存根调用或验证调用之外

如果您的代码库使用JUnit,我建议您使用mockito运行程序,它将验证每个测试方法的mockito使用情况,这意味着任何问题都可能与编写错误的测试有关

@RunWith(MockitoJUnitRunner.class)
public class TheTest {
    @Test public void shoudl_perform_something() { ... }
}
或自2017年10月1日起使用mockito规则

public class TheTest {
    @Rule MockitoRule mockitoRule = MockitoJUnit.rule();
    @Test public void should_perform_something() { ... }
}
您不必在测试中使用have@mock就可以从这个框架验证中获益。 无论如何,与MockitoAnnotations相比,这两种方法都是实例化Mock的首选方法

另外,您正在使用哪个版本的mockito?我相信Mockito已经通过错误代码的位置改进了一些消息

请注意,此代码无法正常工作,因为indProvider.asProvider没有存根,所以mockito将使用默认值null。无论采用哪种方式,都必须对遗留代码使用深存根,返回模拟的模拟通常被视为代码气味,它表明测试的代码破坏了:

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

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

我建议你读这本书,这是你能读到的关于编写测试引导的软件的最好的书之一。我发现它比臭名昭著的高效Java书籍更重要。

代码中可能有一个mockito匹配器,用于存根调用或验证调用之外

如果您的代码库使用JUnit,我建议您使用mockito运行程序,它将验证每个测试方法的mockito使用情况,这意味着任何问题都可能与编写错误的测试有关

@RunWith(MockitoJUnitRunner.class)
public class TheTest {
    @Test public void shoudl_perform_something() { ... }
}
或自2017年10月1日起使用mockito规则

public class TheTest {
    @Rule MockitoRule mockitoRule = MockitoJUnit.rule();
    @Test public void should_perform_something() { ... }
}
您不必在测试中使用have@mock就可以从这个框架验证中获益。 无论如何,与MockitoAnnotations相比,这两种方法都是实例化Mock的首选方法

另外,您正在使用哪个版本的mockito?我相信Mockito已经通过错误代码的位置改进了一些消息

请注意,此代码无法正常工作,因为indProvider.asProvider没有存根,所以mockito将使用默认值null。无论采用哪种方式,都必须对遗留代码使用深存根,返回模拟的模拟通常被视为代码气味,它表明测试的代码破坏了:

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

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

我建议你读这本书,这是你能读到的关于编写测试引导的软件的最好的书之一。我发现它比臭名昭著的高效Java书籍更重要。

这个答案在我看来相当合理。我想知道是否报告了一些其他测试代码的错误,这些测试代码混合了匹配器和原始值。错误消息通常是有用的,它确实提供了一些细节,但似乎不适用于您的问题。就个人而言,我更喜欢JMockit而不是Mockito。这个答案在我看来相当合理。我想知道是否报告了一些其他测试代码的错误,这些测试代码混合了匹配器和原始值。错误消息通常是有用的,它确实提供了一些细节,但似乎不适用于您的问题。就个人而言,我更喜欢JMockit而不是Mockito。