mhe*_*ery 3 java junit unit-testing mocking mockito
我开始使用Mockito这个星期,我有一个问题需要了解@InjectMocks领域.
我有一个类似A的A类:
public class A {
public B b;
public C c;
public String string;
}
Run Code Online (Sandbox Code Playgroud)
当我在JUnit测试中使用它时Mockito,我称之为:
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
B b;
@Mock
C c;
@InjectMocks
A a;
...
}
Run Code Online (Sandbox Code Playgroud)
但我想设置字符串属性!我试试这样:
Mockito.when(a.getString()).thenReturn("STRING");
Run Code Online (Sandbox Code Playgroud)
但是,测试会抛出异常:
org.mockito.exceptions.misusing.MissingMethodInvocationException:when()需要一个必须是'模拟上的方法调用'的参数.例如:when(mock.getArticles()).thenReturn(articles);
此外,此错误可能会显示,因为:1.您存根:final/private/equals()/ hashCode()方法.这些方法无法进行存根/验证.2.在()内部,你不是在模拟上调用方法,而是在某些其他对象上调用方法.3.模拟类的父母不公开.这是模拟引擎的限制.
我可以做其他事来设置这个字段吗?
我可以做其他事来设置这个字段吗?
是的,您可以使用@Spy下一个注释您的字段:
@Spy
@InjectMocks
A a;
Run Code Online (Sandbox Code Playgroud)
然后你就可以做到 Mockito.when(a.getString()).thenReturn("STRING");
实际上,当它仅使用注释时@InjectMocks,Mockito不会模拟它,A默认情况下会创建类的正常实例,这样您就无法使用Mockito.when()它.作为解决方法,您可以要求Mockito使用部分模拟它@Spy.
您实际获得的例外是由于错误消息中提供的案例#2:
在when()中你不是在mock上调用方法而是在其他一些对象上调用方法.