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)
报错图片:在这里插入图片描述从网上找了很久,各种版本都有,所以小菜鸡打算自己解决一下。

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot工程中,NullPointerException通常是由于未正确初始化对象或变量而引起的。以下是一些可能导致NullPointerException的原因和解决方法: 1.对象未正确初始化或注入:请确保您的对象已正确初始化或注入,并且没有在使用之前被设置为null。 2.方法返回null:请确保您的方法在任何情况下都不会返回null。如果方法可能返回null,则应该在调用该方法之前检查返回值是否为null。 3.数组未正确初始化:请确保您的数组已正确初始化,并且没有在使用之前被设置为null。 4.静态变量未正确初始化:请确保您的静态变量已正确初始化,并且没有在使用之前被设置为null。 5.空指针异常可能是由于数据层返回了空值,导致在service层或controller层中使用该值时出现了异常。请检查您的数据层是否正确返回了值,并确保在使用该值之前进行了非空检查。 以下是一些可能有用的代码示例: ```java // 确保对象已正确初始化或注入 @Autowired private MyService myService; // 确保方法不会返回null public String getName() { return Objects.requireNonNull(name, "Name must not be null"); } // 确保数组已正确初始化 int[] arr = new int[10]; // 确保静态变量已正确初始化 private static final MyObject myObject = new MyObject(); // 确保在使用值之前进行非空检查 if (dataSectionService != null) { // 使用dataSectionService的返回值 } else { // 处理dataSectionService为null的情况 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值