我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华。 如果小伙伴们觉得我的文章不错,记得一键三连哦。
一、什么是Mockito
Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象,进而简化有外部依赖的类的测试。
二、有什么作用:
提前创建测试,TDD(测试驱动开发)
- 如果你创建了一个 Mock 那么你就可以在 service 接口创建之前写 Service Tests 了,这样你就能在开发过程中把测试添加到你的自动化测试环境中了。换句话说,模拟使你能够使用测试驱动开发。
团队可以并行工作
- 这类似于上面的那点;为不存在的代码创建测试。但前面讲的是开发人员编写测试程序,这里说的是测试团队来创建。当还没有任何东西要测的时候测试团队如何来创建测试呢?模拟并针对模拟测试!
- 这意味着当 service 接口需要测试时,实际上 QA 团队已经有了一套完整的测试组件;没有出现一个团队等待另一个团队完成的情况。这使得模拟的效益型尤为突出了。
你可以创建一个验证或者演示程序。
- 由于Mocks 非常高效,Mocks 可以用来创建一个概念证明,作为一个示意图,或者作为一个你正考虑构建项目的演示程序。这为你决定项目接下来是否要进行提供了有力的基础,但最重要的还是提供了实际的设计决策。
隔离系统
- 有时,你希望在没有系统其他部分的影响下测试系统单独的一部分。由于其他系统部分会给测试数据造成干扰,影响根据数据收集得到的测试结论。使用 mock 你可以移除掉除了需要测试部分的系统依赖的模拟。
- 当隔离这些 mocks 后,mocks 就变得非常简单可靠,快速可预见。这为你提供了一个移除了随机行为,有重复模式并且可以监控特殊系统的测试环境。
三、具体如何使用:
- 在使用 Mockito 测试框架时,我们需要提前在 idea 中装一个测试插件,这个插件会帮我们生成大部分的测试代码,从而减少我们的一个测试开发成本。
IntelliJ idea 需要安装的测试插件

当我们安装好这个插件后我们只需要选中我们想要测试的类——操作如下:

这里可以根据你们公司所规定的测试版本来,我这里用的是 JUnit5 和 Mockito

经过以上操作后,我们 ServiceImpl 中有几个方法,这个插件就会帮我们生成几个相对应的测试方法,当然这里我们还需要自己手动改一下
- init()和 最下面那个方法是通用的,其方法根据自己的实际情况来测试就可以了。下面看不懂的注解可以去查一下主要是 Junit5 和 Mockito测试框架
3.1 Mockito的API介绍
- 不懂的可以看看这几篇文章,我觉得写的都挺不错。
- MockitoAPI介绍
- Mockito中文文档
3.2案例解析:
要测试的 DtMachineIncomeServiceImpl 实现类
@Service
public class DtMachineIncomeServiceImpl extends ServiceImpl<DtMachineIncomeMapper, DtMachineIncomeEntity> implements DtMachineIncomeService {
@Autowired
private DtMachineAddressIncomeDayService dtMachineAddressIncomeDayService;
@Autowired
private DtMachineInfoService dtMachineInfoService;
@Override
public BigDecimal profitByTeamsAndCurrency(List<Long> teamIds, String currencyMark) {
DynamicTableParser.setId(currencyMark);
List<DtMachineIncomeEntity> machineIncomeEntityList = this.list(Wrappers.lambdaQuery(DtMachineIncomeEntity.class)
.in(DtMachineIncomeEntity::getOrganizationId, teamIds));
return machineIncomeEntityList.parallelStream().map(DtMachineIncomeEntity::getActualTotalIncome).reduce(BigDecimal.ZERO, BigDecimal::add);
}
@Override
public DtMachineIncomeEntity getOneByOrganizationIdAndMachineId(Long organizationId, Long machineIdId) {
return this.getOne(Wrappers.lambdaQuery(DtMachineIncomeEntity.class)
.eq(DtMachineIncomeEntity::getOrganizationId, organizationId)
.eq(DtMachineIncomeEntity::getMachineId, machineIdId)
.last(MybatisPlusConst.LIMIT_1));
}
@Override
public boolean saveDtMachineIncome(DtMachineIncomeEntity entity) {
return this.save(entity);
}
@Override
public boolean updateByDtMachineIncomeId(DtMachineIncomeEntity entity) {
return this.updateById(entity);
}
@Override
public List<DtMachineIncomeEntity> listByTeamId(Long teamId) {
return this.list(Wrappers.lambdaQuery(DtMachineIncomeEntity.class)
.eq(DtMachineIncomeEntity::getOrganizationId, teamId));
}
@Override
public DtMachineIncomeEntity lastTimeByTeamIds(List<Long> teamIdsByUserId) {

本文详细介绍了Mockito这一Java测试框架,通过创建和配置Mock对象,简化依赖于外部系统的类的测试。Mockito的作用包括提前测试、团队并行工作、验证和演示程序的创建以及系统隔离。文中通过实例展示了如何在IDEA中设置测试插件,生成测试代码,并使用Mockito的API进行方法模拟,测试目标类的各个方法。测试用例覆盖了增删查改等多种场景,确保了代码的正确性和测试覆盖率。

最低0.47元/天 解锁文章
7366

被折叠的 条评论
为什么被折叠?



