Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t@InjectMocks属性调用Mockito';什么方法返回?_Java_Unit Testing_Junit_Mocking_Mockito - Fatal编程技术网

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目前没有(我认为)的特性,但它可以有,而且在过去已经被请求过了。