使用Mockito与Squaretest进行单元测试.
项目开发过程中,不少公司都要求写单元测试的代码,可以提高代码的质量,并且可以减少出现BUG的概率。
对于中小型公司来说,对单元测试不做硬性要求,不写最好。因为还是需要一定的工作量,在保证代码质量和性能
的前提下,再去考虑单元测试比较合适。有更好,没有也不影响项目的开发进度。自己所在的项目组对于单元测试
有要求,并且要求被测试代码的覆盖率达到20%及以上,每次发布版本的时候,变更覆盖率需要达标才能够发版。
每次写完代码后,基本都会被要求写单元测试的代码,或者是后期补单元测试的代码,总之都得写。
下面就聊聊自己在项目中是如何写单元测试的,使用的框架是Mockito框架,maven的依赖为,
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
安装Squaretest插件.


选择需要进行单元测试的service实现类.


可以根据需要选择对应的JUnit版本

自己使用的配置为

生成的测试代码示例.
package applets.nature.service.impl;
import applets.nature.entiry.GiftExchangeEntiry;
import applets.nature.entiry.GiftInfo;
import applets.nature.mapper.GiftInfoMapper;
import applets.user.entiry.UserInfo;
import applets.user.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class GiftHandlerServiceImplTest {
@Mock
private GiftInfoMapper mockGiftInfoMapper;
@Mock
private UserService mockUserService;
@InjectMocks
private GiftHandlerServiceImpl giftHandlerServiceImplUnderTest;
@Test
public void testSelectGiftList() throws Exception {
// Setup
final GiftInfo giftInfo = new GiftInfo();
giftInfo.setGiftId("giftId");
giftInfo.setGiftType("giftType");
giftInfo.setGiftTitle("giftTitle");
giftInfo.setGiftDescription("giftDescription");
giftInfo.setGiftFilePath("giftFilePath");
giftInfo.setNeedLevel(0);
giftInfo.setCreateTime("createTime");
giftInfo.setCreateUser("createUser");
giftInfo.setIsInvalid(0);
giftInfo.setStatus(0);
final List<GiftInfo> expectedResult = Arrays.asList(giftInfo);
// Configure GiftInfoMapper.selectGiftList(...).
final GiftInfo giftInfo1 = new GiftInfo();
giftInfo1.setGiftId("giftId");
giftInfo1.setGiftType("giftType");
giftInfo1.setGiftTitle("giftTitle");
giftInfo1.setGiftDescription("giftDescription");
giftInfo1.setGiftFilePath("giftFilePath");
giftInfo1.setNeedLevel(0);
giftInfo1.setCreateTime("createTime");
giftInfo1.setCreateUser("createUser");
giftInfo1.setIsInvalid(0);
giftInfo1.setStatus(0);
final List<GiftInfo> giftInfos = Arrays.asList(giftInfo1);
when(mockGiftInfoMapper.selectGiftList()).thenReturn(giftInfos);
// Configure UserService.selectUserByOpenid(...).
final UserInfo userInfo = new UserInfo();
userInfo.setUserId("userId");
userInfo.setUserName("userName");
userInfo.setNickName("nickName");
userInfo.setOpenid("openid");
userInfo.setUserPhone("userPhone");
userInfo.setAvatarUrl("avatarUrl");
userInfo.setGender(0);
userInfo.setCreateTime("createTime");
userInfo.setRegistrationCode("registrationCode");
userInfo.setUpdateTime("updateTime");
when(mockUserService.selectUserByOpenid("openid")).thenReturn(userInfo);
when(mockGiftInfoMapper.selectUserExchange("openid")).thenReturn(Arrays.asList(0));
// Run the test
final List<GiftInfo> result = giftHandlerServiceImplUnderTest.selectGiftList("openid");
// Verify the results
assertThat(result).isEqualTo(expectedResult);
}
@Test
public void testSelectGiftList_GiftInfoMapperSelectGiftListReturnsNoItems() throws Exception {
// Setup
when(mockGiftInfoMapper.selectGiftList()).thenReturn(Collections.emptyList());
// Configure UserService.selectUserByOpenid(...).
final UserInfo userInfo = new UserInfo();
userInfo.setUserId("userId");
userInfo.setUserName("userName");
userInfo.setNickName("nickName");
userInfo.setOpenid("openid");
userInfo.setUserPhone("userPhone");
userInfo.setAvatarUrl("avatarUrl");
userInfo.setGender(0);
userInfo.setCreateTime("createTime");
userInfo.setRegistrationCode("registrationCode");
userInfo.setUpdateTime("updateTime");
when(mockUserService.selectUserByOpenid("openid")).thenReturn(userInfo);
when(mockGiftInfoMapper.selectUserExchange("openid")).thenReturn(Arrays.asList(0));
// Run the test
final List<GiftInfo> result = giftHandlerServiceImplUnderTest.selectGiftList("openid");
// Verify the results
assertThat(result).isEqualTo(Collections.emptyList());
}
}
生成的代码说明,以查询方法SelectGiftLis为例:如果是测试service接口,一般使用serviceImpl来写测试用例,serviceImpl中一般会引入mapper接口。
测试代码中一般都是先生成一个对象,传入mapper接口方法的参数中,并且会创建一个mapper接口的返回对象。然后在使用serviceImpl来测试查
询方法,mock一个同样的查询参数,serviceImpl查询时就会有返回值。最后比对mapper接口返回的结果和serviceImpl查询返回的结果是否一致。
一致则通过测试,不一致则测试不通过。
点击如下图中的执行即可,效果如下.

有执行不成功的方法,自己在稍微修改一下测试的代码即可。
再次执行结果全部通过.

IDAE插件Squaretest是收费的,免费使用时间为30天。个人版本收费价格为35美元,有破解版本的小伙伴可以分享一下。
参考文章:https://zhuanlan.zhihu.com/p/318426230
完成第一步单元测试,下一步还需要收集测试之后的代码覆盖率。
添加依赖如下.
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
</dependency>
配置maven plugin 插件.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<includes>
<include>com/**/*</include>
</includes>
</configuration>
<executions>
<execution>
<id>pre-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
参考博文.
https://www.cnblogs.com/fnlingnzb-learner/p/10637802.html
依次执行clean/compile/test

遇到问题,没有生成测试报告,也没报错信息。查看控制台信息,发现单元测试被跳过执行。

修改配置后,继续执行,发现如下信息,Skipping JaCoCo execution due to missing execution data file.

去必应搜索查找原因,
https://www.cnblogs.com/trimphNuan/p/13863269.html
说是配置文件中配置了argLine 配置项,导致出现问题,去除后重新执行,代码覆盖率生成成功。


可以点击进入查看每一行代码的覆盖率。绿色的表示测试时已经已经覆盖到该行的代码,粉色的表示未覆盖到。

至此,单元测试操作,并且生成代码覆盖率完成。
最后可以参考一下阿里巴巴写的一篇关于单元测试的博文:《5个编写技巧,有效提高单元测试实践》
https://mp.weixin.qq.com/s/wQjFlXbK3MqKTUX2TfRR0g
使用Mockito与Squaretest进行单元测试.的更多相关文章
- 基于mockito做有效的单元测试
概述 本文讲解的主要是有效和单元的思想,并不是说如何编写单元测试,用于改善和提高开发效率.编码风格.编码可读性和单测效率,不盲目追求覆盖率. 背景 现在很多单元测试只是利用@Test注解把代码或者整个 ...
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)
转:http://blog.csdn.net/yys79/article/details/66472797 最近,项目中频繁用到dubbo,而且java工程用引用了几十个关联系统的服务(如用户认证,基 ...
- [Java SE/Junit] 基于Java的单元测试框架Mockito
Mockito 是一个模拟测试框架,主要功能是在单元测试中模拟类/对象的行为. 1 为什么要使用Mockito? Mock可以理解为创建一个虚假的对象,或者说模拟出一个对象.在测试环境中用来替换掉真实 ...
- junit+mock+spring-test构建后台单元测试
from:从0开始,构建前后端分离应用 1. 一些基本概念 1.1 为什么要进行单元测试?我自己的理解是 1.能够快速发现问题.避免衍生BUG的出现 在对一些现有代码进行修改时,或者修改现有B ...
- 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试
前言 JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量. JUnit 测试框架具有以下重要特性: 测试工具 测试套件 测试运行器 测试分类 了 ...
- Mockito图书馆
转载:https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/Mockito.html#42 org.mockito ...
- Mockito 学习资料
Mockito 学习资料 网址 单元测试指南:Mockito https://blinkfox.github.io/2018/11/15/hou-duan/java/dan-yuan-ce-shi-z ...
- Mockito鸡尾酒第一杯 单测Mock
鸡尾酒 Mockito是Java的单元测试Mock框架. 它的logo是一杯古巴最著名的鸡尾酒Mojito, Mojito鸡尾酒,源自古巴的哈瓦那,带有浓厚的加勒比海风情. 并不浓烈,但是喝一杯下去, ...
- Mockito 简介
Mockito 是一种 Java Mock 框架,主要是用来做 Mock 测试,它可以模拟任何 Spring 管理的 Bean.模拟方法的返回值.模拟抛出异常等等,在了解 Mockito 的具体用法之 ...
- Android Weekly Notes Issue #233
Android Weekly Issue #233 November 27th, 2016 Android Weekly Issue #233 本期内容包括: 用Mockito做RxJava的单元测试 ...
随机推荐
- 1.9 动态解密ShellCode反弹
动态解密执行技术可以对抗杀软的磁盘特征查杀.其原理是将程序代码段中的代码进行加密,然后将加密后的代码回写到原始位置.当程序运行时,将动态解密加密代码,并将解密后的代码回写到原始位置,从而实现内存加载. ...
- 基于BiLSTM-CRF模型的分词、词性标注、信息抽取任务的详解,侧重模型推导细化以及LAC分词实践
基于BiLSTM-CRF模型的分词.词性标注.信息抽取任务的详解,侧重模型推导细化以及LAC分词实践 1.GRU简介 GRU(Gate Recurrent Unit)门控循环单元,是[循环神经网络]( ...
- Window Server+IIS配置实现一台服务器绑定多个HTTPS证书
参考原文链接:https://blog.csdn.net/lengyiqiu/article/details/89182239 此处做个记录防止丢失: 直接上步骤: 1.选安装好SSL证书,供下面配置 ...
- Windows上同时使用有线网络及无线网络连接配置
由于公司搬到了新的办公地点,公司内部只有内网,当需要连接互联网查询资料时只能切换网络,非常麻烦.所以为了能够同时连接连接公司内网,又能够访问互联网,这里介绍如何同时连接无线和有线. 有线网络:10.3 ...
- Hive-分区取TOP N问题
问题背景 设想你对用户在不同品类上的行为打分聚合后得到这样一个表 user_cate_score uid cate score 1 1 0.3 2 2 0.5 8 3 0.9 现在,你想将每个品类的T ...
- Power BI 11 DAY
目录 电商平台流量分析 流量相关指标 流量数量指标 流量质量指标 度量值计算公式 流量转化率重要指标 指标观测维度 电商平台流量分析 电商平台黄金公式:销售额 = 流量 + 转化率 + 客单价 流量相 ...
- 【Unity3D】Renderer Feature简介
1 3D 项目迁移到 URP 项目后出现的问题 3D 项目迁移至 URP 项目后,会出现很多渲染问题,如:材质显示异常.GL 渲染不显示.多 Pass 渲染异常.屏幕后处理异常等问题.下面将针对这 ...
- Spring Boot图书管理系统项目实战-6.图书管理
导航: pre: 5.读者管理 next:7.借阅图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 book.html ...
- C# EnumWindows示例代码
代码开箱即用,唯一需要处理的就是要提供一个进程的pid. using System; using System.Collections.Generic; using System.Linq; usin ...
- C++ 将filesystem::path转换为const BYTE*
std::string s = fs::temp_directory_path().append(filename).string(); LPCBYTE str = reinterpret_cast& ...