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

时间:2016-09-09 15:58:49

标签: java unit-testing junit mocking mockito

本周我开始使用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.模拟类的父母不公开。这是模拟引擎的限制。

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

1 个答案:

答案 0 :(得分:5)

  

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

是的,您可以使用@Spy为您的字段添加注释:

@Spy
@InjectMocks
A a;

然后您就可以Mockito.when(a.getString()).thenReturn("STRING");

实际上,当仅使用@InjectMocks进行注释时,Mockito不会模拟它,默认情况下会创建类A的正常实例,这样您就无法使用{{ 1}}就可以了。作为解决方法,您可以让Mockito.when()使用Mockito部分模拟它。

您实际获得的例外是由于错误消息中提供的案例#2:

  

里面的时候()你不是在模拟上调用方法而是在其他一些对象上调用方法。