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

Mockito,@injectmock在最后一个字段中表现出奇怪的行为

颛孙星海
2023-03-14

我看到了我认为是一种错误的行为。@InjectMocks似乎不会在每种测试方法之前创建一个新的测试主题。就像“模拟”一样。在下面的示例中,如果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 {}

受试者测试。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());        
    }
}

干杯。

共有1个答案

仉昱
2023-03-14

您正在使用@InjectMocks进行构造函数注入。只要Mockito找到未初始化的字段(null),这将起作用。JUnit在每次测试之前都会创建一个新的测试类实例,所以JUnit粉丝(像我一样)永远不会遇到这样的问题。TestNg没有创建测试类的新实例。它保持测试方法之间的状态,所以当mockito注释时。第二次调用initMocks(this),Mockito将找到已初始化的主题字段,并尝试使用字段注入。在另一个回合,这将一直有效,直到场地不是最终的。

这是虫子吗?我认为这不是API设计的自然结果。您的一些解决方法是添加

this.subject = null;

在一些@Aftermethod方法中。

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

  • 问题内容: 对行列表进行排序(在每行的最后一个字段上排序)的最简单方法是什么?每行可能具有可变数量的字段。 就像是 是我想要的,但是sort(1)不需要负数来从末尾而不是从开始选择字段。 我也希望能够选择字段分隔符。 编辑:为问题添加一些特殊性:我要排序的列表是路径名列表。路径名可以是任意深度,因此字段数是可变的。我想对文件名组件进行排序。 此附加信息可能会更改操作行以提取最后一个字段的方式(可以

  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 我创建了一个特殊的应用程序ontext-test.xml在我的测试类中使用它。 应用程序上下文测试。xml 现在,我想使用我的作为自动安装的Bean并将其注入到我的模拟中。 TodoDaoTest.java 这是我的TodoDao类TodoDao。Java语言 当我执行我的测试方法时,我得到了一个java。com上的lang.NullPointerException。梅德赫利菲。教程。托多利斯特。

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

  • 问题内容: 在我的应用程序中,我将附加一个字符串以创建路径以生成URL。现在,我想在按“后退”按钮时删除该附加字符串。 假设这是字符串: 现在我想要一个这样的字符串: 我怎样才能做到这一点? 问题答案: 您可以使用相同的方法