2016.8.15

今天主要研究关于spring boot的测试问题。对于一般的测试在官网上都有详细的解释,但是当对controller进行测试时,还是遇到了一系列的问题。

controller测试都需要考虑什么?

1.发送一个request请求。
2.判断接受到的reponse。
对于这简单的两步,遇到的问题以及解决方案解决如下:

问题1:

在测试controller时,就需要一个web服务,在springboot中如何去使用一个web服务?

解决方案:

在使用springbootTest时,会加载整个spring容器,同时会加载叫做webEnvironment,它是spring boot内嵌的web服务,只要在springbootTest中指定并且启用端口,就可以进行测试controller.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)//当发生错误的时候,可以command+b点进去看下
public class BookControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;
    @Test
    public void testHome(){
        //获取访问url的结果
        String content = restTemplate.getForObject("/book/home", String.class);
        Assert.assertEquals("bookhome", content);
    }

端口指定可以是:

  MOCK(false),
  RANDOM_PORT(true), //内嵌服务,端口是随机的
  DEFINED_PORT(true), //端口是指定的
  NONE(false);

问题2:是否可以对web服务进行Mock进行测试controller.

解决

之前使用过mock相关的测试工具,所以想到是否可以对web进行Mock,spring boot提供了WebMvcTest的注解,在使用这个注解时,必须指定需要测试的是哪个controller.

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
public class BookControllerTest2 {
    @Autowired
    private MockMvc mvc;
    @Test
    public void testHome() throws Exception{
        //希望返回200的状态吗
        mvc.perform(MockMvcRequestBuilders.get("/book/home"))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }

注意:在使用这种方式时,又遇到了一个问题,即我在controller中使用外部的依赖类时,就会报错。通过查看WebMvcTest的源码,在其之上的注释清楚的写了WebMvcTest只会测试controller,而不会加载整个的spring容器。所以当我们使用外部的依赖时,就会出错。这时候,我的第一反应是:WebMvcTest和springBootTest两个注解结合肯定就可以了,测试发现,这两个注解不能一起使用,直接无法运行。最后还是在源码的注释中找到了需要和AutoConfigureMockMvc注解结合使用,就可以使用外部的依赖类。

@RunWith(SpringRunner.class)
@SpringBootTest
//@WebMvcTest
@AutoConfigureMockMvc
public class BookControllerTest3 {
    @Autowired
    private MockMvc mvc;
    @Test
    public void testHome() throws Exception{
        //希望返回200的状态吗
        mvc.perform(MockMvcRequestBuilders.get("/book/home"))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }

总结

之前遇到问题的时候,第一反应是google.其实有时候,源码中暗藏玄机,在注释中有很清楚的描述,不妨一试。
另外,对于测试,自我感觉到,难得不是如何去实现一个测试,而是如何去设计好的测试用例,去cover全面的功能和场景才是最重要的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,007评论 6 342
  • spring官方文档:http://docs.spring.io/spring/docs/current/spri...
    牛马风情阅读 1,782评论 0 3
  • 时间,对我们每个人来说都是刚性的稀缺资源,在过去的狩猎时代,人们花最多的时间是在求得温饱,而工业化生产促进了效率,...
    路上的威利阅读 382评论 0 1
  • 文/陌宇轩 热浪 无故席卷着 草间流逝的风想留下来却没有太多的可能 花朵学会躬身栖地 时刻想提醒乌云和雷 温度展开...
    小哲小诗阅读 162评论 0 0