测试 Spring @MVC 注释
前几天我遇到了一个问题,@Valid 注释被意外地从控制器类中删除。不幸的是,它没有破坏我们的任何测试。我们的单元测试都没有真正运用 Spring AnnotationMethodHandlerAdapter 路径。我们只是直接测试我们的控制器类。
如果我的 @MVC 注释错误,如何编写会正确失败的单元或集成测试?有没有办法让 Spring 使用 MockHttpServlet 或其他东西找到并使用相关控制器?
I ran into a problem the other day where a @Valid annotation was accidentally removed from a controller class. Unfortunately, it didn't break any of our tests. None of our unit tests actually exercise the Spring AnnotationMethodHandlerAdapter
pathway. We just test our controller classes directly.
How can I write a unit or integration test that will correctly fail if my @MVC annotations are wrong? Is there a way I can ask Spring to find and exercise the relevant controller with a MockHttpServlet or something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我为这种事情编写集成测试。假设您有一个带有验证注释的 bean:
和一个处理提交的控制器
,并且您想要测试 @Valid 和 @NotNull 注释是否正确连接:
请参阅我的博客文章 集成测试 Spring 的 MVC注释
I write integration tests for this kind of thing. Say you have a bean with validation annotations:
and a controller that handles the submission
and you want to test that the @Valid and @NotNull annotations are wired correctly:
See my blog post on integration testing Spring's MVC annotations
当然。您的测试没有理由不能实例化自己的 DispatcherServlet,将它与容器中的各种项目(例如 ServletContext)一起注入,包括上下文定义文件。
为此,Spring 附带了各种与 servlet 相关的
MockXYZ
类,包括MockServletContext
、MockHttpServletRequest
和MockHttpServletResponse
。它们并不是通常意义上的真正的“模拟”对象,它们更像是愚蠢的存根,但它们完成了工作。servlet 的测试上下文将包含通常的 MVC 相关 bean,以及要测试的 bean。 servlet 初始化后,创建模拟请求和响应,并将它们提供给servet 的
service()
方法。如果请求正确路由,您可以检查写入模拟响应的结果。Sure. There's no reason why your test can't instantiate its own
DispatcherServlet
, inject it with the various items which it would have in a container (e.g.ServletContext
), including the location of the context definition file.Spring comes with a variety of servlet-related
MockXYZ
classes for this purpose, includingMockServletContext
,MockHttpServletRequest
andMockHttpServletResponse
. They're not really "mock" objects in the usual sense, they're more like dumb stubs, but they do the job.The servlet's test context would have the usual MVC-related beans, plus your beans to test. Once the servlet is initialized, create the mock requests and responses, and feed them into the servet's
service()
method. If request gets routed correctly, you can check the results as written to the mock response.在即将推出的 spring 3.2(可用快照)或使用 spring-test-mvc (https://github.com/SpringSource/spring-test-mvc) 中,您可以这样做:
首先我们模拟验证,因为我们不想测试验证器,只想知道验证是否被调用。
这是我们的测试类:
In upcoming spring 3.2 (SNAPSHOT available) or with spring-test-mvc (https://github.com/SpringSource/spring-test-mvc) you can do it like this:
first we emulate Validation as we do not want to test the validator, just want to know if validation is called.
this is our test class: