Java Can';t@InjectMocks属性调用Mockito';什么方法返回?
本周我开始使用Java Can';t@InjectMocks属性调用Mockito';什么方法返回?,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,本周我开始使用Mockito,我在理解@InjectMocks字段时遇到了一个问题 我有一个a班是这样的: public class A { public B b; public C c; public String string; } @RunWith(MockitoJUnitRunner.class) public class Test { @Mock B b; @Mock C c; @InjectMocks
Mockito
,我在理解@InjectMocks
字段时遇到了一个问题
我有一个a班是这样的:
public class A {
public B b;
public C c;
public String string;
}
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
B b;
@Mock
C c;
@InjectMocks
A a;
...
}
Mockito.when(a.getString()).thenReturn("STRING");
当我在JUnit
测试Mockito
中使用它时,我这样称呼它:
public class A {
public B b;
public C c;
public String string;
}
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
B b;
@Mock
C c;
@InjectMocks
A a;
...
}
Mockito.when(a.getString()).thenReturn("STRING");
但是我想设置字符串属性!我试着这样做:
public class A {
public B b;
public C c;
public String string;
}
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
B b;
@Mock
C c;
@InjectMocks
A a;
...
}
Mockito.when(a.getString()).thenReturn("STRING");
但是,测试会引发异常:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when()需要的参数必须是“模拟的方法调用”。
例如:
when(mock.getArticles())。然后返回(articles)
此外,出现此错误的原因可能是:
1.您可以存根:final/private/equals()/hashCode()方法。这些方法无法存根/验证。
2.在when()中,您不在mock上调用方法,而是在其他对象上调用方法。
3.模拟类的父级不是公共的。这是模拟引擎的一个限制
我可以做些其他事情来设置此字段吗
我可以做些其他事情来设置此字段吗
是的,您也可以用@Spy
注释您的字段,如下所示:
@Spy
@InjectMocks
A a;
然后您将能够执行Mockito.when(a.getString())。然后返回(“STRING”)代码>
实际上,如果只使用@InjectMocks
对其进行注释,Mockito
不会对其进行模拟,那么默认情况下,它会创建类a
的普通实例,这样您就不能在其上使用Mockito.when()
。作为解决方法,您可以要求Mockito
使用@Spy
对其进行部分模拟
您实际得到的异常是由于错误消息中提供的案例2造成的:
在when()中,您不在mock上调用方法,而是在其他对象上调用方法
令人惊叹的!我不明白为什么我不能用Mockito例外的这个“答案”来做这件事。感谢您的解释。虽然这可能有效,但这是对API的严重误用。OP真正想要的是创建一个a
的非模拟实例,其中“string”也设置为某个值。注入这样的非模拟值是Mockito目前没有(我认为)的特性,但它可以有,而且在过去已经被请求过了。