Mockito学习

本文介绍了Mockito,一个流行的Java测试框架,用于创建和配置模拟对象以简化单元测试。文章详细阐述了Mockito的特点、使用步骤以及在SpringBoot测试中的应用实例,强调了其在提高代码质量和减少对外部依赖的作用。
摘要由CSDN通过智能技术生成

简介

Mockito是一个流行的Java测试框架,用于在单元测试中创建和配置模拟对象(Mock Objects)。它允许你模拟复杂的对象,以便在测试中隔离和验证特定的行为。Mockito简化了对外部依赖的测试,使你能够专注于测试代码的逻辑,而不是依赖的具体实现。

Mockito的主要特点包括:

  • 简单易用:Mockito提供了简洁的API,使得创建和配置模拟对象变得非常简单。
  • 灵活性强:你可以使用Mockito来模拟接口、类或者特定的行为。它还支持对模拟对象的交互进行验证,确保它们按照预期的方式被调用。
  • 解耦测试:通过模拟对象,你可以将测试目标与其依赖项解耦。这样,你就可以在不实际创建依赖项的情况下测试你的代码。
  • 验证行为:Mockito允许你验证模拟对象上的方法调用,确保它们以正确的方式和正确的顺序被调用。
  • 支持多种测试框架:Mockito可以与JUnit、TestNG等测试框架无缝集成,使得你可以在各种测试环境中使用它。
  • 扩展性强:Mockito允许你创建自定义的匹配器和答案,以满足特定的测试需求。
  • 在使用Mockito时,你通常会执行以下步骤:
  • 创建模拟对象:使用Mockito的mock()方法创建一个模拟对象。
  • 配置模拟对象的行为:使用when()方法配置模拟对象在特定方法调用时的行为。
  • 执行测试:在测试代码中,将模拟对象传递给被测试对象,并执行相应的操作。
  • 验证交互:使用verify()方法验证模拟对象上的方法调用是否符合预期。

Mockito在单元测试中的应用非常广泛,它可以帮助你提高代码质量,确保代码按照预期工作,并减少测试时对外部依赖的依赖。

示例

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
</dependency>
package springTests;

import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.event.annotation.BeforeTestClass;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = XysdXfxtApplication.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MockitoTest {

    @Test
    public void testQuery() {
        //构建参数
        OperateInfo operateInfo = new OperateInfo(AccessTokenUser.createSystemUser());
        SpecialSupRecordQueryVO vo = new SpecialSupRecordQueryVO();
        //构建模拟对象
        SpecialSupRecordQueryServiceImpl mockSpecialSupRecordQueryService = Mockito.mock(SpecialSupRecordQueryServiceImpl.class);
        //调用safeGet方法,并且id是0b65bf5b44a240798a5dff0cd816b242时,则返回 new SuperviseRecord("000") 对象
        Mockito.when(mockSpecialSupRecordQueryService.safeGet(SuperviseRecord.class, "0b65bf5b44a240798a5dff0cd816b242"))
                .thenReturn(new SuperviseRecord("000"));
        //正常调用,则返回模拟值
        SuperviseRecord record = mockSpecialSupRecordQueryService.safeGet(SuperviseRecord.class, "0b65bf5b44a240798a5dff0cd816b242");
        System.out.println("when--->thenReturn result:" + record.getId());
    }

    @Test
    public void testSave() {
        OperateInfo operateInfo = new OperateInfo(AccessTokenUser.createSystemUser());
        SpecialSupRecordQueryVO vo = new SpecialSupRecordQueryVO();
        //构建模拟对象
        SuperviseRecordServiceImpl mockSuperviseRecordService = Mockito.mock(SuperviseRecordServiceImpl.class);
        //调用importSn方法,并且参数是new MockMultipartFile("testSave", "测试testSave".getBytes()),则返回Arrays.asList("访GJJT20240078", "建议GJJT20240004", "建议GJJT20240003", "网信2024000047", "信GJJT20240017")
        Mockito.when(mockSuperviseRecordService.importSn(operateInfo, new MockMultipartFile("testSave", "测试testSave".getBytes())))
                .thenReturn(new ArrayList<>(Arrays.asList("访GJJT20240078", "建议GJJT20240004", "建议GJJT20240003", "网信2024000047", "信GJJT20240017")));
        List<String> cmpSn = mockSuperviseRecordService.importSn(operateInfo, new MockMultipartFile("testSave", "测试testSave".getBytes()));
        System.out.println("testSave--->cmpSn:" + cmpSn.toString());
    }

    @Test
    public void testGet() {
        OperateInfo operateInfo = new OperateInfo(AccessTokenUser.createSystemUser());
        SpecialSupRecordQueryVO vo = new SpecialSupRecordQueryVO();
        //构建模拟对象
        SuperviseRecordServiceImpl mockSuperviseRecordService = Mockito.mock(SuperviseRecordServiceImpl.class);
        //调用getDisputeRecord方法 并且id是4e53295b1cf341e980257115574221af时,则抛出异常信息
        Mockito.when(mockSuperviseRecordService.getDisputeRecord(operateInfo, "4e53295b1cf341e980257115574221af"))
                .thenThrow(new RuntimeException("根据id没有找到对应的信息"));
        //正常调用,回返回模拟信息
        DisputeRecordDTO disputeRecord = mockSuperviseRecordService.getDisputeRecord(operateInfo, "1");
        System.out.println("when--->thenThrow:" + disputeRecord.getId());
    }

    @Test
    public void testVerify() {
        OperateInfo operateInfo = new OperateInfo(AccessTokenUser.createSystemUser());
        SpecialSupRecordQueryVO vo = new SpecialSupRecordQueryVO();
        //构建模拟对象
        SuperviseRecordServiceImpl mockSuperviseRecordService = Mockito.mock(SuperviseRecordServiceImpl.class);
        mockSuperviseRecordService.getDisputeRecord(operateInfo,"1");
        //校验是否调用getDisputeRecord方法 并且参数为operateInfo和1 一次调用
        Mockito.verify(mockSuperviseRecordService,Mockito.times(1)).getDisputeRecord(operateInfo,"1");
        //二次调用
        Mockito.verify(mockSuperviseRecordService,Mockito.times(2)).getDisputeRecord(operateInfo,"2");
        //getNormalSuperviseRecord方法从没有被调用过
        Mockito.verify(mockSuperviseRecordService,Mockito.never()).getNormalSuperviseRecord(operateInfo,"1");
        //getNormalSuperviseRecord方法至少被调用了一次
        Mockito.verify(mockSuperviseRecordService,Mockito.atLeastOnce()).getNormalSuperviseRecord(operateInfo,"5");
        //deleteDisputeRecord方法至少被调用了5次
        Mockito.verify(mockSuperviseRecordService,Mockito.atLeast(5)).deleteDisputeRecord(operateInfo,"0");
        //正常调用,回返回模拟信息
        DisputeRecordDTO disputeRecord = mockSuperviseRecordService.getDisputeRecord(operateInfo, "1");
        System.out.println("verify:" + disputeRecord.getId());
    }


    @Test
    public void testOtherMehtod() {
        OperateInfo operateInfo = new OperateInfo(AccessTokenUser.createSystemUser());
        SpecialSupRecordQueryVO vo = new SpecialSupRecordQueryVO();
        //构建模拟对象
        SuperviseRecordServiceImpl mockSuperviseRecordService = Mockito.mock(SuperviseRecordServiceImpl.class);
        //监控真实对象
        SuperviseRecordServiceImpl superviseRecordService = Mockito.spy(mockSuperviseRecordService);
        //真正去数据库查询,获取真实数据
        SuperviseRecordEditDTO record = superviseRecordService.getNormalSuperviseRecord(operateInfo, "0b65bf5b44a240798a5dff0cd816b242");
        System.out.println("testOtherMehtod--->spy:"+record.getId());
        //重置mock,清除所有的互动和预设
        Mockito.reset(superviseRecordService);
    }


    @BeforeEach
    public void testBeforeEach() {
        System.out.println("该testBeforeEach方法在每一个测试方法之前执行一次");
    }

    @AfterEach
    public void testAfterEach() {
        System.out.println("该testAfterEach方法在每一个测试方法之后执行一次");
    }

    @BeforeAll
    public void testBeforeAll() {
        System.out.println("该BeforeAll方法在所有方法执行之前执行一次");
    }

    @AfterAll
    public void testAfterAll() {
        System.out.println("该AfterAll方法在所有方法执行之后执行一次");
    }
}

Mockito 对于后端开发人员自测功能是非常方便,而且减少bug,提高自我能力

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值