测试是软件开发中最重要的部分之一。 井井有条的测试有助于使应用程序代码保持良好状态,并且处于工作状态。 有很多不同类型的测试和方法。 在本文中,我想对基于Spring MVC的应用程序进行单元测试进行介绍。 不要希望在这里阅读有关Spring MVC测试的全部内容,因为这只是有关单元测试的第一篇文章。
谈到没有某些应用程序的单元测试,我要测试的是欺骗。 我将使用上一篇文章中的应用程序之一 ,以避免产生闲聊。 一世
建议您在继续阅读当前文章之前对应用程序进行简短概述。 本教程的主要目的是演示如何在注释管理器中为Spring MVC应用程序配置单元测试。
准备工作
开始任何开发之前,我们始终要做的第一件事–在Maven的pom.xml文件中添加新的依赖项。 这种情况也不例外。
...<dependency><groupid>org.springframework</groupid><artifactid>spring-test</artifactid><version>${spring.version}</version><scope>test</scope></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-test-mvc</artifactid><version>1.0.0.M1</version><scope>test</scope></dependency>
...<repositories><repository><id>spring-maven-milestone</id><name>Spring Maven Milestone Repository</name><url>http://maven.springframework.org/milestone</url></repository></repositories>
...
我添加了两个新的依赖项:
- #1Spring测试
- #2 spring-test-mvc
第一个是支持使用JUnit和TestNG等工具测试Spring应用程序。 通常为集成测试框架和单元测试存根定义一个“测试”范围的工件。 第二个用于测试基于Spring MVC服务器端和客户端的基于RestTemplate的代码。 请注意,我添加了新的存储库。 我这样做是因为spring-test-mvc仍然不在官方Maven存储库中。
单元测试的控制器
在这篇文章中,我将为最简单的控制器编写两个单元测试。 这是控制器的代码:
@Controller public class LinkController { @RequestMapping(value="/") public ModelAndView mainPage() { return new ModelAndView("home"); } @RequestMapping(value="/index") public ModelAndView indexPage() { return new ModelAndView("home"); } }
因此,您可以看到控制器中的方法很简单,它们只是返回一些JSP。 控制器的测试意味着检查请求状态(成功的情况下,代码应为200)并验证视图名称。
编写Spring MVC的单元测试
这是Petri Kainulainen的报价:
spring-test-mvc的核心是一个称为MockMvc的类,可用于为使用Spring MVC实现的任何应用程序编写测试。 我们的目标是通过使用MockMvcBuilder接口的实现来创建一个新的MockMvc对象。 MockMvcBuilders类具有四个静态方法,可用于获取MockMvcBuilder接口的实现。 这些方法描述如下:
- 当我们使用Java配置来配置应用程序的应用程序上下文时,必须使用ContextMockMvcBuilder注解ConfigSetup(Class…configClasses)方法。
- 当使用XML配置文件配置应用程序的应用程序上下文时,必须使用ContextMockMvcBuilder xmlConfigSetup(String…configLocations)。
- 当我们要手动配置测试的控制器和所需的MVC组件时,必须使用StandaloneMockMvcBuilder standaloneSetup(Object ... controllers)。
- 当我们已经创建了完全初始化的WebApplicationContext对象时,必须使用InitializedContextMockMvcBuilder webApplicationContextSetup(WebApplicationContext context)。
我将使用Web应用程序上下文,为此,我需要创建一个具有配置的类:
package com.sprhib.init;import org.springframework.context.annotation.*;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.*;@Configuration
@ComponentScan("com.sprhib")
@EnableWebMvc
public class BaseTestConfig {@Beanpublic UrlBasedViewResolver setupViewResolver() {UrlBasedViewResolver resolver = new UrlBasedViewResolver();resolver.setPrefix("/WEB-INF/pages/");resolver.setSuffix(".jsp");resolver.setViewClass(JstlView.class);return resolver;}}
最后是带有测试的类:
package com.sprhib.test;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import com.sprhib.init.BaseTestConfig;@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes=BaseTestConfig.class)
public class LinkControllerTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void init() {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void testHomePage() throws Exception {mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(view().name("home"));}@Testpublic void testIndexPage() throws Exception {mockMvc.perform(get("/index.html")).andExpect(status().isOk()).andExpect(view().name("home"));}}
注意,我使用了静态导入,它们提供了诸如get(),status()等方法的用法。 @WebAppConfiguration是一个类级别的批注,用于声明为集成测试加载的ApplicationContext应该是WebApplicationContext。 添加完所有测试内容后,查看项目结构:
在GitHub上检查项目 。 我希望一切都清楚。 Spring测试MVC项目是测试适当应用程序的好工具。 缺少文档和教程只是一个缺点。 在接下来的教程中,我将开发这个主题。
翻译自: https://www.javacodegeeks.com/2013/04/spring-mvc-introduction-in-testing.html