针对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"));
}
}
网友评论