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