不能@InjectMocks属性调用Mockito的方法然后返回?

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.模拟类的父母不公开.这是模拟引擎的限制.

我可以做其他事来设置这个字段吗?

Nic*_*tto 5

我可以做其他事来设置这个字段吗?

是的,您可以使用@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上调用方法而是在其他一些对象上调用方法.