我看到了我认为是错误的行为。 @InjectMocks 似乎并没有在每个测试方法之前创建一个新的测试主题。正如@Mock 所做的那样。在下面的示例中,如果Subject.section 是最后一个@Test 将失败。如果不是最终的,则都通过。我当前的解决方法是使用@BeforeClass,但这并不理想。
主题.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
进行 constructor 注入。只要 Mockito 发现该字段未初始化(空),这就会起作用。 JUnit 在每次测试之前都会创建测试类的新实例,因此 JUnit 粉丝(像我一样)永远不会遇到这样的问题。 TestNg 没有创建测试类的新实例。它保持测试方法之间的状态,因此当第二次调用 MockitoAnnotations.initMocks(this)
时,Mockito 会发现 subject 字段已经初始化,并会尝试使用 field 注入。这在另一回合将一直有效,直到该领域不是最终的。
这是一个错误吗?我相信不是——而是 API 设计的自然结果。 您的一些解决方法是添加
this.subject = null;
以某种
@AfterMethod
方法。