Spring MVC:测试特定的带注释的方法被调用
在 Spring MVC 3.0 中,如何测试特定方法是否被调用?
例如,我有这个控制器方法:
public class myController {
@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create(ModelMap map) {
map.put("category", new Category());
return new ModelAndView("views/someView", map);
}
}
当有人请求 http://example.com/create url 时,如何测试这个 create()
方法被调用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在单元测试中,您应该只测试控制器的 Java 代码,而不使用任何 Servlet 技术。
在集成测试中,您可以执行以下操作之一:
使用
org.springframework.mock.web
包,其中包含用于请求、响应、servletContext 的 Mock 对象以触发虚假请求在你的控制器并从虚假响应中读取数据。或者使用像 Selenium 这样针对已部署的 Web 应用程序运行的 Web 测试框架。
In Unit Tests, you should only test your controller's Java code, without using any Servlet technology.
In integration tests you can do one of several things:
Use the
org.springframework.mock.web
package in the spring-test artifact, which contains Mock Objects for request, response, servletContext to fire fake requests at your controllers and read the data from the fake responses.Or use a web testing framework like Selenium that works against a deployed webapp.
看起来真的很像集成测试。 Sean Patrick Floyd 已经提到了一些测试方法,但据我了解,这些选项都没有真正测试对 url 的请求是否真正调用该方法。 --mocking方式模拟请求,selenium测试只测试返回值,不测试调用。 -- 不要误解我的意思,我相信这两个其他测试在大多数情况下更好(更容易测试,甚至更有效的测试结果),但如果您真的想测试调用,我会提出这个解决方案。
使用 Selenium(或 Selenium 2/Webdriver)等 Web 测试框架或仅生成 HTTP 请求的简单框架。 -- 要进行该测试,您需要诅咒已部署的应用程序。 ——所以这确实是一个集成测试。
检查该方法是否被调用。我建议使用日志记录工具(Log4J)。然后使用 AspectJ 或 Spring AOP 支持之类的工具将日志记录语句添加到控制器方法中。日志记录应该写入某个记录器,该记录器写入其他目的地,然后写入您使用的其他记录器。
最后一步是,您需要验证预期的日志记录语句是否是测试发送 http 请求后的日志文件。 (请注意,日志记录可能是异步的。)
Looks really like a integration test. Sean Patrick Floyd already mentioned some ways how to test that, but to my understanding none of this options really tests that a request to an url really invokes the method. -- The mocking way simulates the request and the selenium test tests only the return value, but not the Invocation. -- Don't get my wrong, I believe that this two other tests are in most cases better (easyer to test and even more valid test results), but if you really want to test the invokation I would come up with this solution.
Use a web testing framework like Selenium (or Selenium 2/Webdriver) or only a simple one that only generates HTTP requests. -- To do that tests you will need of curse the deployed application. -- so it is realy an integration test.
To check that the method is invoked. I would recommend to use a logging tool (Log4J). Then use a Tool like AspectJ or Spring AOP Support to add logging statements to your controller method. The logging should be written to some logger that writes to an other destination then the other loggers you use.
At the end the last step is, that you need to verify that the expected logging statement is is the logfile after the test sends the http request. (Pay attention to the fact, that the logging may is asynchronous.)