解析单元测试的Mock和InjectMocks

Mockito是一个用于Java应用程序单元测试的开源测试框架。它在开发可测试应用程序中起着至关重要的作用。Mockito用于模拟接口,这样就可以将虚拟功能添加到可以在单元测试中使用的模拟接口中。单元测试是一种软件测试,其中对单个软件组件进行测试。使用Mockito框架的主要目的是通过模拟外部依赖项并在测试代码中使用它们来简化测试的开发。因此,Mockito提供了更简单的测试代码,更容易理解、更容易阅读和修改。Mockito还可以用于其他测试框架,如JUnit和TestNG。因此,在本文中,我们将讨论两者之间的区别 @Mock and @InjectMocks 这是在Mockito框架中可用的两个最重要也最令人困惑的注释。

主要区别

如果我们谈论的是主要的区别,那么我们可以简单地说

@Mock创建一个mock

@ injectmock创建类的一个实例,并将用@Mock注释创建的mock注入到这个实例中

通过一个例子来理解其中的区别

假设我们有两个名为 StudentGrade . 这两个类的代码如下所示 :

public class Student {
    private Grade grade;

    public Student(Grade grade) {
        this.grade = grade;
    }

    public String getGrade(){
        return "student belong to:" + grade.getGradeName();
    }
}
public class Grade {
    private String gradeName;

    public Grade(String gradeName) {
        this.gradeName = gradeName;
    }

    public String getGradeName() {
        return gradeName;
    }
}

从上面的代码中,您可以看到Student类需要Grade来执行获取所在年级的操作。现在让我们对Student.java类执行单元测试.

StudentTest.java类:

@RunWith(MockitoJUnitRunner.class)
class StudentTest {
  
    @Mock
    Grade grade;

    @InjectMocks
    Student student;

    @Test
    void getGrade() {
        when(grade.getGradeName()).thenReturn(" 2 grade ");
        assertEquals("Student belong to: 2 grade",student.getGrade());

    }
}

代码中所发生的是,Mockito将使用 whenthenReturn 方法。最后,使用@ injectmockito将grade放入Student类中。还有一件事你可以注意到,你甚至不需要创建一个新的Student对象。Mockito会帮你注射的。

区别

@Mock @InjectMocks
@Mock创建一个mock。 @ injectmock创建类的一个实例,并将用@Mock注释创建的mock注入到这个实例中。
@Mock用于创建用于支持测试类的测试所需的模拟。 @InjectMocks用于创建需要在测试类中测试的类实例。
用@Mock注释测试依赖关系的注释类。 @ injectmock在需要为给定的类执行实际的方法体时使用。
我们必须为模拟对象定义when-thenReturn方法,以及在实际测试执行期间将调用哪些类方法。 当我们需要用模拟对象初始化所有内部依赖项来正确工作方法时,使用@ injectmock。

补充说明

  1. @Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。

  2. Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。

  3. @Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。

你可能感兴趣的:(架构,单元测试,junit,java)