美文网首页
spring cloud单元测试

spring cloud单元测试

作者: 青城楼主 | 来源:发表于2019-03-26 17:16 被阅读0次

为什么要用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呼出快捷菜单

image

自动创建了test的包和class

在测试类前加上注解

@RunWith(SpringRunner.class)
@SpringBootTest(classes = EurekaClientApplication.class)
@WebAppConfiguration
@ContextConfiguration

public class RunControllerTest { 

image

注意:我的springboottest的值为“EurekaClientApplication”
这是这个模块的main函数的名字:

image

然后加上

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

image

再加上一个before

    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .build();
    }

image

在真实需要测试的代码中加入

    @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());
    }

image image

测试成功!

那么数据库的回滚呢?
加上注解@Rollback

image

同时在方法中加上注解@Transactional

image

如果不希望回滚 将rollback改为false即可

image

作者:难以置信的优雅
链接:https://www.jianshu.com/p/ef9223d5b963
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

另外如果一个controller用到其他的类需要mock的话,可选择mockito或者jmockit或者jmock

相关文章

网友评论

      本文标题:spring cloud单元测试

      本文链接:https://www.haomeiwen.com/subject/lidnvqtx.html