spring框架mvc框架

这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途。 现在是时候讨论使用框架进行集成测试了。

“集成测试”是指将Spring上下文加载到测试环境中,以便控制器可以与合作者一起进行“端到端”测试。

同样,我将从Spring Social Facebook项目中为FacebookPostsController编写一个测试,并且正如您所期望的那样,该测试将是我的FacebookPostsControllerTest类的集成测试版本。 如果您需要查看FacebookPostsController代码或原始的FacebookPostsControllerTest代码,请查看我的上一个博客 。 有关FacebookPostsController代码的完整介绍,请参见Spring Social Facebook博客 。

创建集成测试的第一步是将Spring上下文加载到测试环境中。 这是通过在FacebookPostsControllerTest类中添加以下注释来完成的:

  1. @RunWith ( SpringJUnit4ClassRunner.class )
  2. @WebAppConfiguration
  3. @ContextConfiguration(“文件名”)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({ "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml", "file:src/main/webapp/WEB-INF/spring/data.xml" })
public class FacebookPostsControllerTest {

@RunWith ( SpringJUnit4ClassRunner.class )或@ContextConfiguration(“ file-names”)并没有什么新意,因为它们从Spring 2.5开始就出现了,如果您是Spring开发人员,那么您之前可能已经在集成测试中使用过它们。 新人是@WebAppConfiguration 。

这些批注协同工作以配置您的测试环境。 @RunWith告诉JUnit使用Spring JUnit类运行器运行测试。 @WebAppConfiguration告诉SpringJUnit4ClassRunner集成测试要加载的ApplicationContext应该是WebApplicationContext ,而@ContextConfiguration用于指定加载哪个XML文件以及从何处加载。

在这种情况下,我正在加载项目的“ servlet-context.xml”和“ data.xml”文件。 “ servlet-context.xml”文件包含您希望Spring Web应用程序使用的所有标准位,例如<annotation-driven />和视图解析器,而“ data.xml”则包含供以下人员使用的数据库配置:该应用程序的Spring Social组件。 这里要注意的一点是,我故意使用
我想运行端到端集成测试来访问文件系统,数据库等的伪生产配置文件。

这只是示例代码,在集成测试中通常不会涉及生产数据库或其他相关资源。 通常,您将配置您的应用程序以访问集成测试数据库和其他资源。 解决此问题的一种方法是创建一个测试 XML配置文件。 但是,不要像我在一个项目中看到的那样,为项目中的每个Maven模块创建单独的测试 XML文件。 原因是当您对代码进行更改时,最终要更改一大堆配置文件才能使集成测试再次正常工作,这既无聊又耗时。 更好的方法是拥有一个版本的XML配置,并使用Spring配置文件为不同的环境配置应用程序。 如果确实选择使用配置文件,则还需要将@ActiveProfiles(“profile-name”)批注添加到上面列出的其他三个批注中。 但是,这超出了本博客的范围。

假设您正在使用自动装配,并且已经正确设置了<context:component-scan /> ,那么下一步就是将以下实例变量添加到测试类中:

@Autowired private WebApplicationContext wac;

这告诉Spring将先前创建的WebApplicationContext注入到测试中。 然后,可以在非常简单的一行setup()方法中使用它:

@Before public void setUp() throws Exception { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); }

类似于此测试的“独立” /“编程”版本, setup()方法的目的是创建一个mockMvc实例,然后使用它来执行测试。 此处的区别在于,它只是通过使用WebApplicationContext作为MockMvcBuilders的参数来MockMvcBuilders

整理好setup()方法后,接下来要做的是编写一个测试,我将从上一个博客中重写testShowPostsForUser_user_is_not_signed_in()作为集成测试。 令人惊讶的是,该代码比以前的JUnit版本要简单得多:

@Test public void testShowPostsForUser_user_is_not_signed_in() throws Exception { ResultActions resultActions = mockMvc.perform(get("/posts").accept(MediaType.ALL)); resultActions.andExpect(status().isOk()); resultActions.andExpect(view().name("signin")); }

如果将此代码与我以前的博客中的testShowPostsForUser_user_is_not_signed_in()代码进行比较,您会发现它几乎是相同的。 唯一的区别是无需设置任何模拟对象。

在这一点上,我将演示testShowPostsForUser_user_is_signed_in测试的集成测试版本,但这确实有些棘手。 原因是要掌握他们的Facebook帖子列表,用户必须登录其Facebook帐户,这意味着在正确的必要HttpServletRequest对象之前,需要对服务器进行多次顺序调用状态以方便致电Facebook检索帖子列表。 对于示例代码来说,这似乎有点太复杂了,这是我不想在
真实的项目。

我不是将这种复杂性视为Spring MVC测试框架的局限性,而是要强调最佳实践,这是确保尽可能多地对服务器的调用是独立且原子的。

当然,我可以使用模拟对象或创建虚拟Facebook服务,但是,这超出了本博客的范围。

一个独立的一个很好的例子,原子服务器调用是REST调用testConfirmPurchases_selection_1_returns_a_hat(...)用于测试的OrderController从我采取类的Spring MVC,Ajax和JSON第2部分-服务器端代码博客。 该代码在Ajax博客中进行了全面描述,它请求购买确认,并以JSON的形式返回。

下面OrderController了返回JSON的OrderController代码:

/** * Create an order form for user confirmation */ @RequestMapping(value = "/confirm", method = RequestMethod.POST) public @ResponseBody OrderForm confirmPurchases(@ModelAttribute("userSelections") UserSelections userSelections) { logger.debug("Confirming purchases..."); OrderForm orderForm = createOrderForm(userSelections.getSelection()); return orderForm; } private OrderForm createOrderForm(List<String> selections) { List<Item> items = findItemsInCatalogue(selections); String purchaseId = getPurchaseId(); OrderForm orderForm = new OrderForm(items, purchaseId); return orderForm; } private List<Item> findItemsInCatalogue(List<String> selections) { List<Item> items = new ArrayList<Item>(); for (String selection : selections) { Item item = catalogue.findItem(Integer.valueOf(selection)); items.add(item); } return items; } private String getPurchaseId() { return UUID.randomUUID().toString(); }

尽管它返回的JSON看起来像这样:

{"items":[{"id":1,"description":"description","name":"name","price":1.00}, {"id":2,"description":"description2","name":"name2","price":2.00}],"purchaseId":"aabf118e-abe9-4b59-88d2-0b897796c8c0"}

下面以冗长的样式显示了测试testConfirmPurchases_selection_1_returns_a_hat(...)的代码。

@Test public void testConfirmPurchases_selection_1_returns_a_hat() throws Exception { final String mediaType = "application/json;charset=UTF-8"; MockHttpServletRequestBuilder postRequest = post("/confirm"); postRequest = postRequest.param("selection", "1"); ResultActions resultActions = mockMvc.perform(postRequest); resultActions.andDo(print()); resultActions.andExpect(content().contentType(mediaType)); resultActions.andExpect(status().isOk()); // See http://goessner.net/articles/JsonPath/ for more on JSONPath ResultMatcher pathMatcher = jsonPath("$items[0].description").value("A nice hat"); resultActions.andExpect(pathMatcher); }

上面的代码并不是Spring Guys希望您编写的方式; 但是,以冗长的格式更容易讨论正在发生的事情。 该方法的结构类似于第1部分中讨论的testShowPostsForUser_user_is_signed_in(...)方法。第一步是使用静态MockMvcRequestBuilders.post(...)方法创建MockHttpServletRequestBuilder类型的postRequest对象。 将添加值为"1""selection"参数。

所述postRequest然后被传递给mockMvc.perform(...)方法和一个ResultActions对象返回。

然后,使用andExpect(...)方法验证ResultActions对象,以检查HTTP状态(确定= 200)和内容类型为"application/json;charset=UTF-8"

另外,我添加了一个andDo(print())方法调用,以显示HttpServletRequestHttpServletResponse对象的状态。 该调用的输出如下所示:

MockHttpServletRequest:HTTP Method = POSTRequest URI = /confirmParameters = {selection=[1]}Headers = {}Handler:Type = com.captaindebug.store.OrderControllerMethod = public com.captaindebug.store.beans.OrderForm com.captaindebug.store.OrderController.confirmPurchases(com.captaindebug.store.beans.UserSelections)Resolved Exception:Type = nullModelAndView:View name = nullView = nullModel = nullFlashMap:MockHttpServletResponse:Status = 200Error message = nullHeaders = {Content-Type=[application/json;charset=UTF-8]}Content type = application/json;charset=UTF-8Body = {"items":[{"id":1,"description":"A nice hat","name":"Hat","price":12.34}],"purchaseId":"d1d0eba6-51fa-415f-ac4e-8fa2eaeaaba9"}Forwarded URL = nullRedirected URL = nullCookies = []

最后一项测试使用静态MockMvcResultMatchers.jsonPath(...)检查"$items[0].description"的JSON路径的值是否为"A nice hat" 。 为了使用jsonPath(...)静态方法,您必须在POM.xml中包含JSON Path模块以解析JSON。

<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>0.8.1</version><scope>test</scope></dependency>

JSonPath是一种从JSon数据中选择性提取字段的方法。 它基于XML的XPath思想。

显然,我上面用过的冗长风格不需要编写测试。 下面的代码显示与Spring的Guy设计的相同代码:

@Test public void testConfirmPurchases_spring_style() throws Exception { mockMvc.perform(post("/confirm").param("selection", "1")).andDo(print()) .andExpect(content().contentType("application/json;charset=UTF-8")) .andExpect(status().isOk()) .andExpect(jsonPath("$items[0].description").value("A nice hat")); }

所以,仅此而已。 概括地说,我们的想法是向您的单元测试中添加适当的批注,以便Spring加载您的XML配置以创建WebApplicationContext 。 然后将其注入到您的测试中,并在创建mockMvc时作为参数传递给Spring MVC Test框架。 然后编写测试,其想法是将适当构造的MockMvcRequestBuilders对象传递给mockMvc.perform(...)方法,然后将其返回值声明为通过或失败测试。

该博客的代码可在GitHub上找到: https : //github.com/roghughe/captaindebug/在Facebook和Ajax-JSON项目中。

参考: Spring的MVC测试框架入门–第2部分,来自我们的JCG合作伙伴 Roger Hughes,来自Captain Debug的Blog博客。

翻译自: https://www.javacodegeeks.com/2013/07/getting-started-with-springs-mvc-test-framework-part-2.html

spring框架mvc框架

spring框架mvc框架_Spring MVC测试框架入门–第2部分相关推荐

  1. gtest测试框架使用详解_测试框架TestNG使用介绍

    近期接触到了一个比较全面的基于Java的接口自动化测试框架,作为一名Java小白,所以打算研究一下,顺带学习学习Java,该测试框架的逻辑控制层使用的HttpClient + TestNG. 在本期中 ...

  2. python主讲移动端自动化测试框架appium_Appium-移动端自动测试框架,如何入门?...

    Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试. 它使用WebDriver协议驱动iOS,Android和Windows应用程序. Appium是在手机操作系统自带的测 ...

  3. spring mvc示例_Spring MVC示例

    spring mvc示例 Welcome to Spring MVC Example. Sometime back in Spring MVC Tutorial, I explained how to ...

  4. java spring 传大数据类型_Spring MVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

  5. spring mvc教程_Spring MVC教程

    spring mvc教程 1.简介 作为企业Java开发人员,这项工作的主要重点之一是开发Web应用程序. 对于Web应用程序,后果还包括许多挑战. 具体来说,其中一些是状态管理,工作流和验证. HT ...

  6. spring mvc 教程_Spring MVC开发–快速教程

    spring mvc 教程 这是我们的JCG合作伙伴之一,来自Manoj的有关使用Spring开发Web应用程序的简短教程, 网址为" The Khangaonkar Report &quo ...

  7. spring mvc国际化_Spring MVC国际化(i18n)和本地化(L10n)示例

    spring mvc国际化 Welcome to the Spring Internationalization (i18n) tutorial. Any web application with u ...

  8. spring mvc原理_Spring MVC的工作原理,我们来看看其源码实现

    来源:https://www.cnblogs.com/youzhibing/p/10695012.html 作者:youzhibing2904 遗留问题 在关于利用maven搭建ssm的博客,我们一起 ...

  9. java spring mvc 实例_spring mvc 简单实例

    转至:http://blog.csdn.net/dingx/article/details/2242105 Spring Framework可以被使用在很多场合之中,考虑到目前大多数Java EE的项 ...

  10. java mvc 菜鸟_Spring MVC 简单入门

    1331601238 卢久贵 web.xml 配置: dispatcher org.springframework.web.servlet.DispatcherServlet 加载/WEB-INF/s ...

最新文章

  1. ORACLE数据库对比表结构
  2. 深度学习三大谜团:集成、知识蒸馏和自蒸馏
  3. 51CTO第2本书样章曝光:DHCP服务器规划与应用案例
  4. 【机器学习】机器学习项目流程
  5. SAP系统和微信集成的系列教程之四:如何将SAP C4C主数据变化推送给微信公众号的关注者
  6. tkinter的GUI设计:界面与逻辑分离(三)-- 多页面
  7. 【Python】 配置解析ConfigParser 命令行参数解析optparser
  8. Linux下查看CPU个数(逻辑个数和物理个数)
  9. pandas 分层取5个数据_Pandas数据可视化的9个要点「附案例」
  10. RabbitMq(九) SpringBoot整合RabbitMQ消费者示例代码
  11. VSNETcodePrint 2005 SQL ServerPrint 2005
  12. 制作课件的软件及特点作用
  13. 史上最全Java面试题整理(附参考答案)
  14. Windows平台下面MD5 SHA1 SHA256命令行工具
  15. 花生壳内网穿透映射NPM私服问题
  16. QT 中英文切换-国际化(解决部分翻译不起作用的问题)
  17. ssh连接提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY
  18. 【JZOJ A组】C
  19. 如何用java让坦克发射子弹_手把手教你用Java实现一个简易联网坦克对战小游戏 !...
  20. 微信小程序+jsp+Mysql 电影详情的微信小程序 源代码+设计文档+说明文档

热门文章

  1. Hadoop入门(八)Mapreduce高级shuffle之Partitioner
  2. 常用公有云接入——阿里
  3. 汇编语言(二十三)之求一个数的补数
  4. JAVA后端面试100 QA之第一篇
  5. Java面试常问计算机网络问题
  6. Redis进阶之持久化
  7. HashMap 和 HashTable 到底哪不同 ?
  8. java中判断一个字符在字符串中出现的次数
  9. Tomcat9.0 设置局域网内其他电脑或手机端访问{9.0更新}
  10. 三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...