mock 单元测试 mockmvc详解
mock(模拟)
依赖于spring的框架和spring的环境
切片测试:指用mockmvc测试controller层,模拟返回service层的值,将层与层间的联系断开。
集成测试:指用mockmvc测试controller层,但不间隔service层。将controller层和service层集合起来测试。
java的单元测试框架有junit、mockMvc等
java的mock框架一般有Mockito、EasyMock、powerMock等(框架用来提供mock的工具,用于mock的打桩和断言)
springMVC的测试中,一般采用mockMvc+Mockito的组合来进行mock模拟测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = Application. class ) <br> @ContextConfiguration (loader = SpringBootContextLoaderEx. class ) public class ControllerTestJuint extends BaseJunit{ private MockMvc mockMvc; @Autowired protected WebApplicationContext wac; // mock的对象,stationService被mockbean注解之后,会自己注入到容器当中,stationService中的所有方法除开被打桩返回的,其余调用时,都返回null @MockBean private StationService stationService; @Before () //这个方法在每个方法执行之前都会执行一遍 public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象 SecurityUtils.setSecurityManager(wac.getBean(SecurityManager. class ); }<br> @Test public void mockTest() throws Exception{ // 打桩,给指定方法返回值 when(stationService.add(any(),any())).thenReturn( true ); // 给返回值为void的方法打桩 doNothing.when(stationService).updateService(any()); ResultActions reaction = this .mockMvc.perform(MockMvcRequestBuilders.post( "/sys/out/mockTest" ) .contentType(MediaType.APPLICATION_JSON) //请求体时json .param( "customerId" , "7" ) .param( "serviceType" , "all_service" ) .param( "params[company_id]" , "1110000" ) //组装map对象 .param( "params[AGE]" , "0,5" )) .anddo(MockMvcResultHandlers.print()) // 控制台打印出请求体 ); reaction.andExpect(MockMvcResultMatchers.status().isOk()); MvcResult mvcResult =reaction.andReturn(); System.out.println(mvcResult.getResponse().getContentAsString()); TimeUnit.SECONDS.sleep( 60 * 60 ); } } |
thenReturn 中可以指定多个返回值。在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值
mockito不支持对静态(static)方法进行打桩。可以使用PowerMock对静态方法进行打桩
1 | PowerMockito.mockStatic(AmountUtil. class );<br>PowerMockito.when(AmountUtil.CustomFormatWith2Digits(anyInt())).thenReturn( "zzzz" ); |
对mvc的controller层进行测试,使用Mockmvc
对普通方法进行单元测试,使用junit
普通方法也能进行mock,使用junit+mockitor
普通方法测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Test public void testBubbleSort() { Node node1 = new Node( 1 ); Node node2 = new Node( 2 ); Node node3 = new Node( 3 ); Node[] nodes = {node1,node2,node3}; bubbleSort.bubbleSort(nodes); Assert.assertEquals( 3 , nodes[ 0 ].getValue()); // 断言,验证测试的正确性 Assert.assertEquals( 2 , nodes[ 1 ].getValue()); Assert.assertEquals( 1 , nodes[ 2 ].getValue()); } |
mockitor 可以使用verify来验证方法的调用次数
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?