微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Mockito,@ InjectMocks最终字段的奇怪行为

我看到的行为我认为是一个错误. @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());        
    }
}

干杯.

解决方法

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

这是一个错误吗?我不相信 – 而是API设计的自然结果.
您可以添加一些解决方法

this.subject = null;

在一些@AfterMethod方法中.

原文地址:https://www.jb51.cc/java/122048.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐