java – Mockito,@ InjectMocks最终字段的奇怪行为
发布时间:2020-12-14 05:35:30 所属栏目:Java 来源:网络整理
导读:我看到的行为我认为是一个错误. @InjectMocks似乎在每个测试方法之前都没有创建新的测试主题. @Mock的地方.在以下示例中,如果Subject.section是最终的,则@Test失败.如果它不是最后都通过.我目前的解决方法是使用@BeforeClass,但这并不理想. Subject.java: p
我看到的行为我认为是一个错误. @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方法中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |