2016.8.15

作者: zhjwang | 来源:发表于2017-08-15 23:32 被阅读12次

    今天主要研究关于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全面的功能和场景才是最重要的。

    相关文章

      网友评论

          本文标题:2016.8.15

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