为什么要用MockMvc
可能我们在测试控制层的代码都是启动服务器,在浏览器中输入URL,然后开始测试是否达到预期效果,发生错误的话,修改相关代码并重启服务器再次进行测试。分析一下这个过程,启动服务器-->打开浏览器-->输入URL-->等待返回结果-->修复bug-->重启服务器.....循环。
其中的缺点也挺明显的,在浏览器输入URL的地址,如果是GET请求还好,POST请求或者DELETE请求怎么办?只能借助其他工具,通过命令行编写curl语句,或者借助谷歌浏览器的postman插件,亦或者自己在代码中通过编写相应httpClient方法来实现测试,但是这几种方法都较为麻烦,而且测试用例并不能较好的保存。再说一个缺点,代码修改后,往往需要再次重启服务器,等待启动完毕才能接下来的测试过程。
如果tomcat服务器启动速度较慢,这将是一件非常痛苦的事情,测试验证也不方便,且依赖网络环境,这些原因导致测试起来很麻烦,而为了可以方便对Controller进行测试,且很好的保存和循环使用测试用例,则可以通过单元测试来解决,通过前面一篇文章,大家对于单元测试的便利性有了认识和体会,接下来通过引入MockMVC进行控制层的单元测试。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
基于intellij,期间有红色报错请相应添加依赖,不强调
pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
controller:
@GetMapping("/lskTest")
@ApiOperation(value="lskTest")
public String lskTest(@RequestParam String uid){
return uid;
}
alt+insert呼出快捷菜单
自动创建了test的包和class
在测试类前加上注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EurekaClientApplication.class)
@WebAppConfiguration
@ContextConfiguration
public class RunControllerTest {
注意:我的springboottest的值为“EurekaClientApplication”
这是这个模块的main函数的名字:
然后加上
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
再加上一个before
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
在真实需要测试的代码中加入
@Test
public void testUserController() throws Exception {
RequestBuilder request = null;
//路径
request = get("/run/lskTest/")
//参数
.param("uid", "1wqeqweqweqweqweq")
//接受的数据类型
.accept(MediaType.APPLICATION_JSON);
mvc.perform(request)
//状态吗是否相等
.andExpect(status().isOk())
//得到的信息是否与特定字段匹配
.andExpect(content().string("1wqeqweqweqweqweq"))
//输出信息
.andDo(print());
}
测试成功!
那么数据库的回滚呢?
加上注解@Rollback
同时在方法中加上注解@Transactional
如果不希望回滚 将rollback改为false即可
作者:难以置信的优雅
链接:https://www.jianshu.com/p/ef9223d5b963
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
另外如果一个controller用到其他的类需要mock的话,可选择mockito或者jmockit或者jmock