美文网首页Java
SpringMVC-单元测试

SpringMVC-单元测试

作者: 张明学 | 来源:发表于2020-06-13 22:43 被阅读0次

良好的开发习惯从单元测试开始。基于Web开发的单元测试可以分为三层进行,Controller层的单元测试、Service层的单元测试、Dao层的单元测试。

Jar依赖准备

<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13</version>
     <scope>test</scope>
</dependency>
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-test</artifactId>
</dependency>

Controller层的单元测试


Controller层的单元测试基类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mvc.xml"})
// 配置加载WebApplicationContext的根目录(web资源的根目录),默认值也是:src/main/webapp
@WebAppConfiguration(value = "src/main/webapp")
public class BaseControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    protected MockMvc mockMvc;

    /**
     * 初始化SpringmvcController类测试环境
     */
    @Before
    public void init(){
        //加载web容器上下文
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
}

@ContextConfiguration Spring整合JUnit4测试时,使用该注解引入配置文件,可以配置多个配置文件。如:{ “classpath:/spring1.xml”, “classpath:/spring2.xml” })

Controller层的Get与Post请求的单元测试

@Slf4j
public class HelloControllerTest extends BaseControllerTest {

    protected MockHttpSession mockHttpSession;
    protected MockHttpServletRequestBuilder mockHttpServletRequestBuilder;

    /**
     * 做单元测试准备数据
     */
    @Before
    public void init() {
        super.init();
        mockHttpSession = new MockHttpSession();
        mockHttpSession.setAttribute("sessionKey1", "sessionKey1Value");
    }

    /**
     * 模拟GET请求的单元测试
     *
     * @throws Exception
     */
    @Test
    public void helloGetTest() throws Exception {
        mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/hello/info")
                // 设置header值
                .header("header1", "v1")
                .param("key1", "value1")
                .param("key2", "value2")
                // 设置session
                .session(mockHttpSession);

        MvcResult mvcResult = mockMvc.perform(mockHttpServletRequestBuilder)
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        log.info(mvcResult.getResponse().getContentAsString());

    }

    /**
     * 模拟POST请求的单元测试
     *
     * @throws Exception
     */
    @Test
    public void helloPostTest() throws Exception {
        String jsonParam = "{\"key1\":\"value1\",\"key2\":\"value2\"}";

        mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/hello/info")
                // 设置header值
                .header("header1", "v1")
                // 以JSON格式传输数据
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                // POST中的报文体中的数据
                .content(jsonParam)
                // 设置session
                .session(mockHttpSession);

        MvcResult mvcResult = mockMvc.perform(mockHttpServletRequestBuilder)
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        log.info(mvcResult.getResponse().getContentAsString());

    }

}

对Controller层返回结果添加断言

mockMvc.perform().andExpect(ResultMatcher) 即为对返回结果添加断言,ResultMatcher通过MockMvcResultMatchers的status(),header(),content()等等即可获取。常用的有:
HandlerResultMatchers handler():请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器;
RequestResultMatchers request():得到RequestResultMatchers验证器;
ModelResultMatchers model():得到模型验证器;
ViewResultMatchers view():得到视图验证器;
FlashAttributeResultMatchers flash():得到Flash属性验证;
StatusResultMatchers status():得到响应状态验证器;
HeaderResultMatchers header():得到响应Header验证器;
CookieResultMatchers cookie():得到响应Cookie验证器;
ContentResultMatchers content():得到响应内容验证器;
JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher):得到Json表达式验证器;
XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<string, string=""> namespaces, Object... args):得到Xpath表达式验证器;
ResultMatcher forwardedUrl(final String expectedUrl):验证处理完请求后转发的url(绝对匹配);
ResultMatcher forwardedUrlPattern(final String urlPattern):验证处理完请求后转发的url(Ant风格模式匹配,@since spring4);
ResultMatcher redirectedUrl(final String expectedUrl):验证处理完请求后重定向的url(绝对匹配);
ResultMatcher redirectedUrlPattern(final String expectedUrl):验证处理完请求后重定向的url(Ant风格模式匹配,@since spring4);

Service层的单元测试


Service层单元测试的基类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test/applicationContext.xml"})
public class BaseServiceTest {
    
}

Service层的单元测试只需要加载Service层所需要的配置即可(service层通常调用Dao层,故也需要Dao层的配置)。

Service层单元测试的示例

public class HelloServiceTest extends BaseServiceTest {

    @Autowired
    private HelloService helloService;

    @Test
    public void sample(){
        helloService.sample();
    }

}

相关文章

  • SpringMVC-单元测试

    良好的开发习惯从单元测试开始。基于Web开发的单元测试可以分为三层进行,Controller层的单元测试、Serv...

  • SpringMVC-请求参数绑定原理

    控制层框架历史: Servlet->Structs1.0->Structs2.0->SpringMVC->Spri...

  • 【springmvc-完整篇】

    springmvc-完整篇 本文根据学习视频做的笔记,视频来源-Bilibili:尚硅谷SpringMVC实战教程...

  • SpringMVC-入门

    Hello SpringMVC 引用 HelloController:写类实现Controller,重写handl...

  • SpringMVC-上传

  • SpringMVC

    SpringMVC-请求过程 请求离开浏览器。它会带有用户请求内容的信息,至少包含请求的URL(还可能有其他信息,...

  • 单元测试

    内容 单元测试 参考文章: [iOS单元测试系列]单元测试框架选型 iOS单元测试:Specta + Expect...

  • SpringMVC- No mapping found for

    问题描述:警告: No mapping found for HTTP request with URI [/Spr...

  • SpringMVC-参数绑定

    一、概要 在springmvc中,接收前端提交的数据是通过方法形参来接收的。从客户端请求的key/value数据,...

  • SpringMVC-响应内容

    一、@ResponseBody(重点) 1、作用 该注解用于将Controller的方法返回的对象,通过适当的Ht...

网友评论

    本文标题:SpringMVC-单元测试

    本文链接:https://www.haomeiwen.com/subject/pphtxktx.html