可能咱们在测试控制层的代码都是启动服务器,在浏览器中输入URL,而后开始测试是否达到预期效果,发生错误的话,修改相关代码并重启服务器再次进行测试。分析一下这个过程,启动服务器-->打开浏览器-->输入URL-->等待返回结果-->修复bug-->重启服务器.....循环。
其中的缺点也挺明显的,在浏览器输入URL的地址,若是是GET请求还好,POST请求或者DELETE请求怎么办?只能借助其余工具,经过命令行编写curl语句,或者借助谷歌浏览器的postman插件,亦或者本身在代码中经过编写相应httpClient方法来实现测试,可是这几种方法都较为麻烦,并且测试用例并不能较好的保存。再说一个缺点,代码修改后,每每须要再次重启服务器,等待启动完毕才能接下来的测试过程。
若是tomcat服务器启动速度较慢,这将是一件很是痛苦的事情,测试验证也不方便,且依赖网络环境,这些缘由致使测试起来很麻烦,而为了能够方便对Controller进行测试,且很好的保存和循环使用测试用例,则能够经过单元测试来解决,经过前面一篇文章,你们对于单元测试的便利性有了认识和体会,接下来经过引入MockMVC进行控制层的单元测试。
MockMvc实现了对Http请求的模拟,可以直接使用网络的形式,转换到Controller的调用,这样可使得测试速度快、不依赖网络环境,并且提供了一套验证的工具,这样可使得请求的验证统一并且很方便。java
pom依赖:web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
controller:spring
@GetMapping("/lskTest") @ApiOperation(value="lskTest") public String lskTest(@RequestParam String uid){ return uid; }
alt+insert呼出快捷菜单数据库
自动建立了test的包和class浏览器
在测试类前加上注解tomcat
@RunWith(SpringRunner.class) @SpringBootTest(classes = EurekaClientApplication.class) @WebAppConfiguration @ContextConfiguration public class RunControllerTest {
注意:个人springboottest的值为“EurekaClientApplication”
这是这个模块的main函数的名字:springboot
而后加上服务器
@Autowired private WebApplicationContext context; private MockMvc mvc;
再加上一个before网络
@Before public void setUp() throws Exception { mvc = MockMvcBuilders .webAppContextSetup(context) .build(); }
在真实须要测试的代码中加入mvc
@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便可