简介
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,提高自我能力