美文网首页
Spring对Controller的单元测试技术

Spring对Controller的单元测试技术

作者: JohnYuCN | 来源:发表于2021-08-08 00:57 被阅读0次

    针对Controller进行单元测试的技术关键点在于需要创造一个MockMvc对象,而此对象的创建需要使用到WebApplicationContext对象,整个测试技术就是围绕这个问题展开的。


    天津马场道别具风格的星巴克 2021-07-20

    1. 配置类:

    @EnableWebMvc,可以保证容器内已经注入了WebApplicationContext

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "cn.johnyu.controllers")
    public class WebConfig {
    }
    

    2. 测试类可以找到WebApplicationContext的第一种方法:

    如果WebConfig.java中已经使用了@EnableWebMvc,可以直接使用@SpringJUnitConfig,即可保证注入了WebApplicationContext

    @SpringJUnitConfig(WebConfig.class)
    @RunWith(SpringRunner.class)
    public class ControllerTest {
        @Autowired
        private CommonController commonController;
        @Autowired
        private WebApplicationContext context;
    

    3. 测试类可以找到WebApplicationContext的第二种方法:

    @WebAppConfiguration的加入,相当于为启动的测试容器注入了WebApplicationContext ,此时WebConfig不需要再使用@EnableWebMvc

    @SpringJUnitConfig(WebConfig.class)
    @RunWith(SpringRunner.class)
    @WebAppConfiguration
    public class ControllerTest {
        @Autowired
        private CommonController commonController;
        @Autowired
        private WebApplicationContext context;
    

    4. 测试类可以找到WebApplicationContext的第三种方法:

    @SpringJUnitWebConfig替换@SpringJUnitConfig

    @SpringJUnitWebConfig(WebConfig.class)
    @RunWith(SpringRunner.class)
    public class ControllerTest {
        @Autowired
        private CommonController commonController;
        @Autowired
        private WebApplicationContext context;
    

    5. 测试方法的完整代码:

    package cn.johnyu.controllers;
    
    import cn.johnyu.config.AppConfig;
    import cn.johnyu.config.MyConf;
    import cn.johnyu.config.WebConfig;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
    import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.context.web.WebAppConfiguration;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MockMvcBuilder;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
    
    //@SpringJUnitWebConfig(classes = {WebConfig.class})
    //@WebAppConfiguration
    @SpringJUnitConfig(WebConfig.class)
    @RunWith(SpringRunner.class)
    public class ControllerTest {
        @Autowired
        private CommonController commonController;
        @Autowired
        private WebApplicationContext context;
    
        private MockMvc mockMvc;
        @Before
        public void before(){
           this.mockMvc=MockMvcBuilders.webAppContextSetup(this.context).build();
        }
        @Test
        public void testLogin() throws Exception{
           mockMvc.perform(get("/login"))
                   .andExpect(status().isOk()).andExpect(content().string("suc"));
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Spring对Controller的单元测试技术

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