当前位置: 首页 > 知识库问答 >
问题:

@InjectMocks属性不能调用Mockito的方法ThenReturn吗?

鲁华茂
2023-03-14

本周我开始使用mockito,但我遇到了一个问题,无法理解@injectmocks字段。

我有一个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");

但是,测试抛出一个异常:

MissingMethodInvocationException:when()需要一个必须是“mock上的方法调用”的参数。例如:when(mock.getarticles()).ThenReturn(articles);

此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。2.内部when()不是对mock而是对其他对象调用method。3.被嘲弄班级的家长不是公共的。这是模拟引擎的一个限制。

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

共有1个答案

施旭东
2023-03-14

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

是的,您也可以用@spy将字段注释为下一个:

@Spy
@InjectMocks
A a;

那么您将能够执行mockito.when(.getString()).ThenReturn(“String”);

实际上,当它仅使用@injectmocks进行注释时,mockito不会对它进行模拟,默认情况下,它会创建类a的普通实例,这样您就不能在它上面使用mockito.when()。作为解决办法,您可以要求mockito使用@spy对其进行部分模拟。

您实际得到的异常是由于错误消息中提供的情况#2:

在when()中,您不是在mock上调用method而是在其他对象上调用method。

 类似资料:
  • 我不明白为什么这段带有Java泛型的代码无法编译。给定这个类: 无法模拟getList返回值: 使用“when…then”的唯一方法似乎是完全剥离泛型,代价是编译器警告: 最终,只有这样才能奏效:

  • 我有一个类,它有两个方法。我想模拟这个类,然后模拟第一个方法,但不是第二个。 例如。 单元测试代码: 奇怪的是m2没有被调用。 我错过什么了吗?

  • 问题内容: 我有这段代码在做Range Minimum Query 。当t = 100000时,i和j始终在每条输入行中更改,因此在Java 8u60中其执行时间约为12秒。 当我提取一个新方法以找到最小值时,执行时间快了4倍(约2.5秒)。 我一直认为方法调用很慢。但是这个例子却相反。Java 6也演示了这一点,但是在两种情况下(17秒和10秒)执行时间都慢得多。有人可以对此提供一些见识吗? 问

  • 我有一段代码在做最小范围查询。当t=100000时,i和j在每个输入行中总是发生变化,其在Java8u60中的执行时间约为12秒。 当我提取一个新方法来寻找最小值时,执行时间快了4倍(大约2.5秒)。 我一直认为方法调用很慢。但是这个例子显示了相反的情况。Java6也演示了这一点,但是两种情况下的执行时间都要慢得多(17秒和10秒)。有人能对此提供一些见解吗?

  • 我有一个GWT应用程序,我从文本框中获取输入,检查正则表达式的值,如果匹配,然后我将该文本添加到表格中。当我为例如“你好”输入任何正确的输入时,它工作得非常好。 任何帮助都将不胜感激。

  • 问题内容: 我在Mockito中有这个: 该方法应始终返回一个新实例,但它会返回两次相同的引用。 为什么该方法不返回新值? 问题答案: 该方法将始终返回传递给它的内容。该代码是在调用之前执行的。然后将创建的内容传递给。因此有一个绝对的实例而不是创建机制。 如果需要提供新实例,请使用thenAnswer