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全面的功能和场景才是最重要的。

你可能感兴趣的:(2016.8.15)