Java Mockito doReturn,如果调用了具有特定类的对象的方法
如果我有一个对象MyObject,我想在调用该对象的某个方法时返回一些值。例如,类似这样的事情:Java Mockito doReturn,如果调用了具有特定类的对象的方法,java,unit-testing,spring-boot,junit,mockito,Java,Unit Testing,Spring Boot,Junit,Mockito,如果我有一个对象MyObject,我想在调用该对象的某个方法时返回一些值。例如,类似这样的事情: doReturn(someValue).when(Mockito.any(MyObject.class)).getSomeValue(); 我试过这样做,但不起作用: org.mockito.exceptions.misusing.NullInsteadOfMockException: Argument passed to when() is null! 您需要使用Mockito.mock(M
doReturn(someValue).when(Mockito.any(MyObject.class)).getSomeValue();
我试过这样做,但不起作用:
org.mockito.exceptions.misusing.NullInsteadOfMockException:
Argument passed to when() is null!
您需要使用
Mockito.mock(MyObject.class)
来创建对象的mock
目前,您正在使用Mockito#any,它是一个参数匹配器,用于在为任何给定参数调用存根方法时定义mock上的行为
@Test
public void testMock() throws InterruptedException {
MyObject myObjectMock = Mockito.mock(MyObject.class);
doReturn(2).when(myObjectMock).getSomeValue();
System.out.println(myObjectMock.getSomeValue()); // prints 2
}
private class MyObject {
public int getSomeValue() {
return 1;
}
}
或者,您可以使用Mockito注释:
@RunWith(MockitoJUnitRunner.class)
public class YourTestClass {
@Mock
MyObject myObjectMock
避免您在设置或测试方法中手动模拟该对象。您是对的,您的示例是有效的,但在我的情况下,我想我必须添加一些附加内容,因为它不返回任何值。@mirzak我不太明白您的意思,您能举个例子吗?此解决方案是正确的,我的对象被无关的内容覆盖。我只需使用ReflectionTestUtils将其设置为我的字段。ReflectionTestUtils.setField(this.someService,“myField”,mock);这是一个更好的解决方案,因为您可以在mutliple测试中使用模拟对象(此处为myObjectMock)。在我的项目中,我们使用@ExtendWith(MockitoExtension.class)而不是@RunWith(MockitoJUnitRunner.class),您可以声明一个没有注释的字段,但是您必须在@Before方法中手动实例化模拟。请注意,ExtendWith是JUnit5,这个答案是在JUnit5可用之前编写的。