@Mock和@injectmock在Mockito中的区别
Mockito是一个用于Java应用程序单元测试的开源测试框架。它在开发可测试应用程序中起着至关重要的作用。Mockito用于模拟接口,这样就可以将虚拟功能添加到可以在单元测试中使用的模拟接口中。单元测试是一种软件测试,其中对单个软件组件进行测试。使用Mockito框架的主要目的是通过模拟外部依赖项并在测试代码中使用它们来简化测试的开发。因此,Mockito提供了更简单的测试代码,更容易理解、更容易阅读和修改。Mockito还可以用于其他测试框架,如JUnit和TestNG。因此,在本文中,我们将讨论两者之间的区别 @Mock and @InjectMocks 这是在Mockito框架中可用的两个最重要也最令人困惑的注释。
主要区别
如果我们谈论的是主要的区别,那么我们可以简单地说
@Mock创建一个mock, @ injectmock创建类的一个实例,并将用@Mock注释创建的mock注入到这个实例中
让我们用一个简单的例子来理解上面的陈述 Java.
通过一个例子来理解其中的区别
假设我们有两个名为 Student 和Pen . 这两个类的代码如下所示 :
Student.java Class:
class Student {
private Pen pen;
public Student(Pen pen) {
this.pen = pen;
}
public String write() {
return "Student Write with: " + pen.getRedPen();
}
}
Pen.java Class:
class Pen {
private String redPen;
public Pen(String redPen) {
this.redPen = redPen;
}
String getRedPen() {
return redPen;
}
}
从上面的代码中,您可以看到Student类需要Pen来执行写操作。现在让我们对Student.java类执行单元测试.
StudentTest.java类:
@RunWith(MockitoJUnitRunner.class)
class StudentTest {
@Mock
Pen pen;
@InjectMocks
Student student;
@Test
public void writeWithPenTest() throws Exception {
Mockito.when(pen.getRedPen()).thenReturn("Red Pen");
assertEquals("Student Write with: Red Pen", student.write());
}
}
代码中所发生的是,Mockito将使用 when 和thenReturn 方法。最后,使用@ injectmockito将Pen放入Student类中。还有一件事你可以注意到,你甚至不需要创建一个新的Student对象。Mockito会帮你注射的。
// we don't have to do this
Student student = new Student(pen);
区别
@Mock | @InjectMocks |
---|---|
@Mock创建一个mock。 | @ injectmock创建类的一个实例,并将用@Mock注释创建的mock注入到这个实例中。 |
@Mock用于创建用于支持测试类的测试所需的模拟。 | @InjectMocks用于创建需要在测试类中测试的类实例。 |
用@Mock注释测试依赖关系的注释类。 | @ injectmock在需要为给定的类执行实际的方法体时使用。 |
我们必须为模拟对象定义when-thenReturn方法,以及在实际测试执行期间将调用哪些类方法。 | 当我们需要用模拟对象初始化所有内部依赖项来正确工作方法时,使用@ injectmock。 |