当前位置: 首页 > 面试题库 >

Mockito,@ InjectMocks具有最终字段的奇怪行为

端木骞尧
2023-03-14
问题内容

我看到了我认为是错误的行为。@InjectMocks似乎并没有在每种测试方法之前创建一个新的测试主题。就像@Mock一样。在下面的示例中,如果Subject.section是最后一个,则@Test失败。如果不是最后两个都通过。我当前的解决方法是使用@BeforeClass,但这并不理想。

Subject.java:

package inject_mocks_test;
public class Subject {

    private final Section section;

    public Subject(Section section) {
        this.section = section;
    }

    public Section getSection() {
        return section;
    }
}

Section.java:

package inject_mocks_test;

public class Section {}

SubjectTest.java

package inject_mocks_test;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;

public class SubjectTest {

    @Mock
    Section section;

    @InjectMocks
    Subject subject;

    @BeforeMethod
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test1() {
        assertEquals(section, subject.getSection());
    }

    @Test
    public void test2() {
        assertEquals(section, subject.getSection());        
    }
}

干杯。


问题答案:

您正在使用@InjectMocksfor 构造函数
注入。只要Mockito发现未初始化的字段(空),这将起作用。JUnit在每次测试之前都会创建一个新的测试类实例,因此JUnit粉丝(像我一样)将永远不会遇到此类问题。TestNg不会创建测试类的新实例。它保持测试方法之间的状态,因此当MockitoAnnotations.initMocks(this)第二次调用时,Mockito将发现已经初始化的
主题 字段并尝试使用 字段 注入。另一方面,这将起作用,直到该字段不是最终的。

这是一个错误吗?我相信不是-这是API设计的自然结果。一些解决方法是添加

this.subject = null;

用某种@AfterMethod方法。



 类似资料:
  • 问题内容: 在我们的团队中,我们发现在使用和限定词时都有一些奇怪的行为。这是我们的测试课程: 运行该方法时,将得到以下结果: 我会理解它是否两次都写值,因为静态类成员的代码是从上到下执行的。 谁能解释为什么这种现象发生? 问题答案: 这些是您运行程序时采取的步骤: 在可以运行之前,必须按外观顺序通过运行静态初始化程序来初始化该类。 要初始化该字段,请开始执行。 打印的值。由于字段类型为,因此看起来

  • 我看到了我认为是一种错误的行为。@InjectMocks似乎不会在每种测试方法之前创建一个新的测试主题。就像“模拟”一样。在下面的示例中,如果Subject.section是最终的@Test失败。如果不是最后都通过。我目前的解决方案是使用@BeforeClass,但这并不理想。 Subject.java: Section.java: 受试者测试。JAVA 干杯。

  • 注意1:如果您有相同类型的字段(或相同的擦除),最好用匹配的字段命名所有@mock注释字段,否则Mockito可能会混淆,不会发生注入。 这是否意味着如果我有几个具有相同类型的字段,我不能只模拟其中一个字段,而是应该为所有具有相同类型的字段定义?这是已知的限制吗?有什么原因为什么它还没有被修复?通过字段名称匹配应该很简单,不是吗?

  • 问题内容: 我在JTextPane / JTextField(或它们下方的字体渲染中的某个地方)中发现了一个奇怪的错误。我想知道是否有人遇到过这种情况,并且可能对此有解决方案。 我试图在JTextPane中显示一些“特殊”或稀有字符,并且一旦更改JTextField的字体(与JTextPane完全无关!),JTextPane就会“分手”,不再显示这些字符字符。 这应该可以更好地解释我的意思: 编辑

  • 鉴于以下代码: 为什么开关语句在上匹配? 我的理解是,当时,不匹配,因为(实际上)计算结果为false。VS Code上的IntelliSense告诉我,也是一个

  • 我最近注意到一些流口水规则的奇怪行为。我有班级心率,它有以下字段: 我的规则文件如下: 我想将字段<代码>心率更改为<代码>心率,并在我的规则中更改字段名称,以便我的新规则现在是: 但这会产生错误,即drools无法解析该字段的心率。但是,当我将规则更改回原来的规则时,使用心率(heartRate),它可以正常工作,尽管这样的字段已经不存在了。我得到以下错误: