springboot项目中使用junit mockmvc进行单元测试

一、为什么进行单元测试

翻看知乎,关于单元测试的作用,看到了一个精辟的回答,大致意思是“单元测试没多少用,业务需求变化快得你来不及做单元测试”。就目前的工作现状来看,还真是这样,现在的软件开发,基本上是面向数据库表编程,和面向领导编程,需求的变化频度高。面向对象,面向领域的思想缺乏,导致单元测试也无法成体系的展开。不过,自己研究了下,总归要做一下笔记,相信后面OO的能力也会逐步提高。
接下来介绍下如何在SpringBoot项目中,使用junit测试业务层代码,使用MockMvc测试控制层代码。
(栗子使用的是ruoyi-vue的代码,本人的开发环境是intellij idea)

二、使用junit测试业务层代码

1、个人项目的结构如下,main包下是源码文件,test包下是建立的测试文件
在这里插入图片描述
2、对业务层接口的测试,只需要在需要测试的文件下,进行如下操作
在这里插入图片描述
选择需要调试的接口,如果有测试前需要准备的工作,勾选@Before;如有测试完,需要处理的操作,勾选@After
在这里插入图片描述
ide会自动在test目录下建立对应的包及测试文件。注意测试类需要添加的注解,@RunWith(SpringRunner.class),@SpringBootTest,不同的版本可能添加的注解不一样。(SpringBoot1.4版本之前用的是@RunWith(SpringJUnit4ClassRunner.class),@SpringApplicationConfiguration(classes = Application.class))
在这里插入图片描述
现在就可以愉快的测试业务代码了。

三、使用mockmvc测试控制层代码

要测试控制层代码怎么办?和上面一样,先生成控制层的测试文件。
由于ruoyi框架使用了SpringSecurity做访问安全控制,所以需要引入SpringSecurity对MockMvc的支持,首先需要在pom中引入jar包:

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<version>5.1.2.RELEASE</version>
			<scope>test</scope>
		</dependency>

然后在测试文件中才可以import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
注意这个类在spring-boot-start-test中是没有的,需要引入spring-security-test

在这里插入图片描述
引入后,在测试控制器前,设置环境:

  mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .apply(springSecurity()) //这里是导入的静态类中的方法,该方法能模拟springSecurityFilterChain请求
                .build();

以下是两个模拟测试的文件

    @Test
    public void loginTest() throws Exception{
        mockMvc.perform(MockMvcRequestBuilders
                .post("/login")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .param("username","admin")
                .param("password","admin123")
                .param("code",getCode())
                .param("uuid",uuid))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }
    @Test
    public void getInfo() throws Exception{
        mockMvc.perform(MockMvcRequestBuilders
                .get("/system/dept/{deptId}",100)
                // 设置返回值类型为utf-8,否则默认为ISO-8859-1
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .param("deptId", "100"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                //.andExpect(MockMvcResultMatchers.content().string("Hello Tom!"))
                .andDo(MockMvcResultHandlers.print());
    }

更多参考:
1、spring security对mockMVC的支持,官方指南:https://docs.spring.io/spring-security/site/docs/5.1.2.RELEASE/reference/html5/#test-mockmvc
2、stackoverflow中关于无法找到SecurityMockMvcConfigurers的解决办法,https://stackoverflow.com/questions/36824973/cant-find-securitymockmvcconfigurers
3、导入spring-security-test之后出现了依赖冲突,依赖冲突的解决办法。https://blog.csdn.net/goquesting/article/details/78422964
4、知乎上springboot 与mockmvc集成的介绍(推荐):https://zhuanlan.zhihu.com/p/61342833
5、MockMvc在RESTful中的参数问题(表单参数,路径参数,json参数):https://blog.csdn.net/wsh596823919/article/details/81662887

发布了18 篇原创文章 · 获赞 19 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/xujinggen/article/details/103789648