4.2 测试 Web 应用程序
Spring MVC 有一个优点:它的编程模型是围绕 POJO 展开的,在 POJO 上添加注解,声明如何处理 Web 请求。这种编程模型不仅简单,还让你能像对待应用程序中的其他组件一样对待这些控制器。你还可以针对这些控制器编写测试,就像测试 POJO 一样。
举例来说,考虑 ReadingListController
里的 addToReadingList()
方法:
@RequestMapping(method=RequestMethod.POST)
public String addToReadingList(Book book) {
book.setReader(reader);
readingListRepository.save(book);
return "redirect:/readingList";
}
如果忽略 @RequestMapping
注解,你得到的就是一个相当基础的 Java 方法。你立马就能想到这样一个测试,提供一个 ReadingListRepository
的模拟实现,直接调用 addToReadingList()
,判断返回值并验证对 ReadingListRepository
的 save()
方法有过调用。
该测试的问题在于,它仅仅测试了方法本身,当然,这要比没有测试好一点。然而,它没有测试该方法处理/readingList 的 POST
请求的情况,也没有测试表单域绑定到 Book
参数的情况。虽然你可以判断返回的 String
包含特定值,但没法明确测试请求在方法处理完之后是否真的会重定向到/readingList。
要恰当地测试一个 Web 应用程序,你需要投入一些实际的 HTTP 请求,确认它能正确地处理那些请求。幸运的是,Spring Boot 开发者有两个可选的方案能实现这类测试。
Spring Mock MVC:能在一个近似真实的模拟 Servlet 容器里测试控制器,而不用实际启动应用服务器。
Web 集成测试:在嵌入式 Servlet 容器(比如 Tomcat 或 Jetty)里启动应用程序,在真正的应用服务器里执行测试。
这两种方法各有利弊。很明显,启动一个应用服务器会比模拟 Servlet 容器要慢一些,但毫无疑问基于服务器的测试会更接近真实环境,更接近部署到生产环境运行的情况。
接下来,你会看到如何使用 Spring Mock MVC 测试框架来测试 Web 应用程序。然后,在 4.3 节里你会看到如何为运行在应用服务器里的应用程序编写测试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论