java的单元测试-mock测试
文章目录
- 简介
- Assert
- mockMVC
- 优化
- mockBean(模拟bean和测试接口)
简介
对于普通的方法,通常采用断言测试。
对于接口,需要使用mockMvc
对于未开发的功能,需要mockBean模拟一个业务bean
Assert
java自身携带的工具类,也可以用于一些对抛出异常要求不高的业务或者存在全局异常的项目
Assert.notNull(in,"入参不存在");
另外有一个更加简单的写法,以assert开头
assert method != null;
mockMVC
曾使用注入方式得到mockMvc,类加上@WebMvcTest注解,实际测试发现这样回影响service bean的注入。
@Slf4j
@SpringBootTest
public class MvcTest {private MockMvc mockMvc;@Autowiredprotected WebApplicationContext wac;@SneakyThrows@Testvoid testGetOne(){mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();TestGeOne in = new TestGeOne();in.setId(1);JSONObject jsonObject = new JSONObject();mockMvc.perform(MockMvcRequestBuilders.post("/test/getOne").content(JSON.toJSONBytes(in)).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpectAll(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),MockMvcResultMatchers.jsonPath("$.data.id",Is.is(1)),MockMvcResultMatchers.jsonPath("$.data.name").isString()).andDo(MockMvcResultHandlers.print());}
}
优化
添加BeforeEach注解,用于每次初始化mock
@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@MockBeanprivate TestServcie testServcie;//在每个测试方法执行之前都初始化MockMvc对象@BeforeEachpublic void setupMockMvc() {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}
mockBean(模拟bean和测试接口)
关键引用import static org.mockito.Mockito.*;
否则使用Mockito.when
另外就是在接口或者实现方法上加MockBean,这里注解可以放接口也可以具体的实现service。
注意mock(TestGetOneRes.class);
实际测试中存在问题
@Slf4j
@SpringBootTest
public class MockBeanTest {@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@MockBeanprivate TestServcie testServcie;//在每个测试方法执行之前都初始化MockMvc对象@BeforeEachpublic void setupMockMvc() {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();TestGetOneRes testGetOneRes = new TestGetOneRes();testGetOneRes.setId(1);testGetOneRes.setName("mock 测试");//静态导入import static org.mockito.Mockito.*;才能使用when方法when(testServcie.getOne(1)).thenReturn(testGetOneRes);//另一种写法TestGetOneRes testGetOneRes2 = new TestGetOneRes();testGetOneRes2.setId(2);doReturn(testGetOneRes2).when(testServcie).getOne(2);}@SneakyThrows@Testvoid testGetOne(){TestGeOne in = new TestGeOne();in.setId(1);Assert.notNull(in,"入参不存在");mockMvc.perform(MockMvcRequestBuilders.post("/test/getOne").content(JSON.toJSONBytes(in)).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpectAll(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),MockMvcResultMatchers.jsonPath("$.data.id", Is.is(1)),MockMvcResultMatchers.jsonPath("$.data.name").isString()).andDo(MockMvcResultHandlers.print());}}
当出现多个mock都符合条件的时候,一般是最后一条mock生效。
但是如果中间出现抛异常,就直接返回了
//入参等于某个值Mockito.when(testServcie.getOne(Mockito.eq(1))).thenReturn(testGetOneRes);//任意值Mockito.when(testServcie.getOne(Mockito.any())).thenReturn(testGetOneRes);//抛异常Mockito.when(testServcie.getOne(Mockito.isNotNull())).thenThrow(MyException.class);//自定义Mockito.when(testServcie.getOne(Mockito.anyInt())).thenAnswer(new Answer() {@Overridepublic Object answer(InvocationOnMock invocationOnMock) throws Throwable {Method method = invocationOnMock.getMethod();Object[] arguments = invocationOnMock.getArguments();//这里是因为只有一个入参,所以就直接使用第一参数Integer id = (Integer)arguments[0];TestGetOneRes testGetOneRes = new TestGetOneRes();testGetOneRes.setId(id);testGetOneRes.setName(id + ":" + new Date().toString());return testGetOneRes;}});
java的单元测试-mock测试相关推荐
- java单元测试之Mock测试编写
mock框架官方文档地址:https://javadoc.io/static/org.mockito/mockito-core/3.2.0/org/mockito/Mockito.html#verif ...
- java的mock测试框架
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- java 单元测试 私有成员变量,单元测试时测试一个private私有方法 - - ITeye博客
直接上例子 待测试的类 [code="java"]public class Calculator { private int count = 0; private int add( ...
- Java单元测试之模拟利器-使用PowerMock进行Mock测试
首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...
- Java的Mock测试到底怎么使用
Java的Mockito测试如何使用 由于种种原因,我们暂时无法从数据库.或者依赖其他系统的接口中,无法获取到测试数据,我们难以对自己的接口顺利进行测试,所以我们可以使用Mockito测试框架来Moc ...
- JAVA测试类注解以及Mock测试
我们在项目中,经常要编写一个测试类XXXXXTest,其中一般会用到以下注解: 一.常用注解 1. @RunWith(PowerMockRunner.class) JUnit将会调用@RunWith中 ...
- Golang单元测试、Mock测试以及基准测试
之前参加字节跳动青训营而整理的笔记 Golang拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码. 一.单元测试 单元测试主要包括:输入.测试单元.输出.期望以及与期望的 ...
- 带你读懂mock测试——单元测试实践篇
1.什么是mock测试? Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的比较复杂的对象,用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法. 2.为什么要进行Mock测试? ...
- java unit test moke_惊了,unittest做接口mock测试竟然这么简单
在项目研发的时候,一般开发会先提供接口文档,虽然很多接口并没有被实现,但测试可以提前写好Mock,等接口实现时可以快速完成该接口的自动话代码编写,进而提高接口自动化测试效率,那么使用Python如何实 ...
最新文章
- 安装icephp 记
- php网站导航-国际网址导航系统 v5.0源码
- 计算时间差_小王子是怎么用四步法进行时间计算并成功避开日界线的
- 【Elasticsearch】Elasticsearch gateway 流程分析
- IA-32 System-Level Registers and Data Structures
- 怎么把 html做成雪花特效,CSS3 HTML5下雪特效 雪花飘飘
- Hbase namespace操作入门
- 获取google chrome浏览器的安装位置
- 给本本K46C升级内存并升级64位WIN7
- 网易微专业产品经理 学习笔记 ——(1)产品经理之道
- 熊猫烧香版《菊花台》pk《菊花台》
- springmvc全局异常处理
- 解密宝典——十招教你学会软件破解
- 重磅!实在智能首创“智能融合拾取”技术!
- R语言 devtools
- 搭建线上教学平台前,需要明确哪些问题?
- MySQL简单命令和SELECT查询,给字段起别名【MySQL数据库】
- Windows Forms(二)
- 推荐 10 个不错的网络监视工具
- 深入理解并发编程之CAS无锁机制与ABA问题