模拟 web环境 测试控制器
模拟web环境:不需要真正启动web服务器,只是对web环境进行简单的模拟。
涉及注解:
1、@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
2、@AutoConfigureMockMvc 贴这个注解,就可以在测试类注入一个MockMvc类型的实例变量。通过MockMvc这个实例变量可用于模拟浏览器来发送请求,获取返回值:ModelAndView
测试方法编写步骤:
1、用MockMvc向指定URL发送模拟请求,获取控制器返回的ModelAndView
2、用Assertions的断言方法断言ModelAndView中的数据与期望数据一致
测试:
测试最开始的index方法,该方法只是返回一个视图页面
用@AutoConfigureMockMvc 这个注解来的到依赖注入的对象 MockMvc,用这个对象来模拟浏览器发送请求。
测试添加书籍的方法
测试添加书籍的方法,该方法返回的也是一个视图,mvc流程
注意映射路径和参数的使用方式
测试查询书籍的方法
测试删除的方法
注意点:断言的时候,测试model里面的视图名称,跟重定向的路径是否一致,需要把整个return的路径拿来判断,不能只写 /listBooks, 要写全:“redirect:/listBooks”
具体代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class MvcControllerTest {
//这个 MockMvc 的作用类似于测试RestFul API 的TestRestTemplate
//区别:这个是用来模拟浏览器发送各种请求(get、post)
@Autowired
private MockMvc mockMvc;
//测试 index 方法,index方法返回的是一个视图
@Test
public void testIndex() throws Exception {
//发送请求
ModelAndView mv = mockMvc.perform(MockMvcRequestBuilders.get("/index"))
.andReturn() //返回的结果
.getModelAndView(); //获取返回结果的model
//断言ModelAndView中封装的信息与期望的信息是否一致
//判断提示信息
Assertions.assertEquals("第一个springboot页面",mv.getModel().get("controllerPage"));
//判断返回的model页面是否一致
Assertions.assertEquals("first",mv.getViewName());
}
//测试 添加书籍的方法,原本的添加书籍的方法返回的是视图页面
//参数化测试,可以让方法进行多次测试
@ParameterizedTest //允许测试方法接收参数进行测试,和注解 @CsvSource 一起使用,@CsvSource注解用来写参数数据
//参数是一个数组,数组里面的每一个元素就是方法的参数
@CsvSource({"书籍AA,100,ljh", "书籍BB,110,ljh", "书籍CC,120,ljh"})
public void testAddBook(String name , BigDecimal price , String author) throws Exception {
ModelAndView mv = mockMvc.perform(MockMvcRequestBuilders.post("/addBook")
.param("name", name)
.param("price", price + "") //参数通过http发送,都得是 String 类型的
.param("author", author)
).andReturn().getModelAndView();
//断言视图数据是否一致
Assertions.assertEquals("redirect:listBooks",mv.getViewName());
}
//测试查询的方法---原方法返回的是视图
@Test
public void testList() throws Exception {
ModelAndView mv = mockMvc.perform(MockMvcRequestBuilders.get("/listBooks"))
.andReturn().getModelAndView();
//断言返回的视图是否一致
Assertions.assertEquals("listBooks",mv.getViewName());
//打印出返回的数据 //强壮
Object books = mv.getModel().get("books");
}
//测试删除的方法--原方法返回的是视图
@ParameterizedTest
@ValueSource(ints = {73,74,79})
public void testDeleteBookById(Integer id) throws Exception {
//获取视图
ModelAndView mv = mockMvc.perform(MockMvcRequestBuilders.get("/deleteBook/{0}", id))
.andReturn().getModelAndView();
//断言测试
Assertions.assertEquals("redirect:/listBooks",mv.getViewName());
}
}