本周我开始使用Mockito
,我在理解@InjectMocks
字段方面遇到了问题。
我有一个类似A的A类:
public class A {
public B b;
public C c;
public String string;
}
当我在使用JUnit
进行Mockito
测试时使用它时,我称之为:
@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()需要一个参数,该参数必须是模拟'上的方法调用。 例如: 当(mock.getArticles())thenReturn(文章);
此外,此错误可能会显示,因为: 1.你存在以下任何一个:final / private / equals()/ hashCode()方法。这些方法无法进行存根/验证。 2.在()内部,你不会在模拟上调用方法,而是在某些其他对象上调用方法。 3.模拟类的父母不公开。这是模拟引擎的限制。
我可以做其他事情来设置这个字段吗?
答案 0 :(得分:5)
我可以做其他事情来设置这个字段吗?
是的,您可以使用@Spy
为您的字段添加注释:
@Spy
@InjectMocks
A a;
然后您就可以Mockito.when(a.getString()).thenReturn("STRING");
实际上,当仅使用@InjectMocks
进行注释时,Mockito
不会模拟它,默认情况下会创建类A
的正常实例,这样您就无法使用{{ 1}}就可以了。作为解决方法,您可以让Mockito.when()
使用Mockito
部分模拟它。
您实际获得的例外是由于错误消息中提供的案例#2:
里面的时候()你不是在模拟上调用方法而是在其他一些对象上调用方法。