解析单元测试的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注入到待处理的对象中。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Mockito进行单元测试时,我们可以使用不同的方法来创建和注入模拟对象。其中包括initMocks、@Mock和@InjectMocks。 initMocksMockito框架提供的一个方法,用于在@Before注解方法中初始化使用@Mock注解创建的模拟对象。这个方法可以减少重复的模拟对象创建代码,使测试类更易读,并且在验证错误时更容易识别模拟对象的字段名。\[1\] @Mock注解用于创建模拟对象,可以在测试类的字段上使用。通过使用@Mock注解,我们可以将模拟对象注入到被测试对象中,以便进行单元测试。\[2\] @InjectMocks注解用于将模拟对象注入到被测试对象中。它会自动查找被测试对象中需要注入的模拟对象,并将其注入。这样可以减少手动注入的代码量。\[3\] 综上所述,使用Mockito进行单元测试时,我们可以使用initMocks方法来初始化模拟对象,使用@Mock注解来创建模拟对象,使用@InjectMocks注解将模拟对象注入到被测试对象中。这些方法可以帮助我们更方便地进行单元测试。 #### 引用[.reference_title] - *1* *2* *3* [Solved - JUnit Mockito: 比较 @Inject @InjectMocks @MockBean @Mock](https://blog.csdn.net/creepcheck/article/details/105986289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

分布式架构之巅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值