Springboot mockMVC 测试错误 java.lang.NullPointerException

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)
报错图片:Springboot mockMVC 测试错误 java.lang.NullPointerException_第1张图片从网上找了很久,各种版本都有,所以小菜鸡打算自己解决一下。

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的构造器,主要有两种构造方法:StandaloneMockMvcBuilderDefaultMockMvcBuilder,分别对应独立安装测试集成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"}

参考博客:

SpringMVC 测试 mockMVC

你可能感兴趣的:(spring,boot)