Springboot mockMVC 测试错误@TOC
SpringBoot测试错误
spring boot初学,在运行单元测试的时候报出了java.lang.NullPointerException的错误:
java.lang.NullPointerException:
at com.springboot42.web.WebApplicationTests.getUser(WebApplicationTests.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
报错图片:从网上找了很久,各种版本都有,所以小菜鸡打算自己解决一下。
MockMVC 测试
先展示一下报错的代码:
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class WebApplicationTests {
private MockMvc mockMvc;
@Test
public void getUser() throws Exception {
String responseString = mockMvc.perform(MockMvcRequestBuilders.post("/getUser")).andReturn().getResponse().getContentAsString();
System.out.println("result : "+responseString);
}
}
这是一个简单的请求响应内容显示测试,但是却出现了上面的错误。最后发现是因为没有构造MockMVC。
MockMvcBuilder
MockMvcBuilder是用来构造MockMvc的构造器,主要有两种构造方法:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应独立安装测试和集成Web环境测试。
独立安装方法:
MockMvcBuilders.standaloneSetup(Object… controllers):通过参数指定一组控制器,这样就不用从容器获取了。下面代码中的WebController是自己编写的一个控制器。
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class WebApplicationTests {
private MockMvc mockMvc;
@Before
public void setup() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build(); //构造MockMVC
}
@Test
public void getUser() throws Exception {
String responseString = mockMvc.perform(MockMvcRequestBuilders.post("/getUser")).andReturn().getResponse().getContentAsString();
System.out.println("result : "+responseString);
}
}
主要是两个步骤:
1)首先自己创建相应的控制器,注入相应的依赖;
2)通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,通过build得到一个MockMvc。
集成Web环境方法:
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定web应用容器WebApplicationContext,将会从该容器获取相应的控制器并得到相应的MockMvc;
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class WebApplicationTests {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setup(){
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //构建MockMVC
}
@Test
public void getUser() throws Exception {
String responseString = mockMvc.perform(MockMvcRequestBuilders.post("/getUser")).andReturn().getResponse().getContentAsString();
System.out.println("result : "+responseString);
}
}
注意:
(1)@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;
(2)通过@Autowired WebApplicationContext wac:注入web环境的ApplicationContext容器;
(3)然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建一个MockMvc进行测试;
测试结果:
result : {"name":"小明","age":12,"pass":"123456"}