首页 > 其他分享 >解决 JUnit 版本引起的 SpringBoot 测试环境加载问题

解决 JUnit 版本引起的 SpringBoot 测试环境加载问题

时间:2024-01-29 16:56:47浏览次数:24  
标签:SpringBoot JUnit userList org test import junit 测试环境

SpringBoot项目初始化后尝试自己编写测试类时报错空指针异常,在此记录下解决方法,如有错误,欢迎指正!

1. 问题描述

1.1 报错信息

在执行Spring Boot单元测试时遇到如下报错信息:

java.lang.NullPointerException
	at com.thr.usercenter.SampleTest.testSelect(SampleTest.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

1.2 报错代码

  • src/test/java/com/thr/usercenter/SampleTest.java
import com.thr.usercenter.mapper.UserMapper;
import com.thr.usercenter.model.User;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
public class SampleTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        // 查询所有
        List<User> userList = userMapper.selectList(null);
        // 这里判断查出来的是否有五条数据
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}

2. 报错分析

报错说明在代码中的这行:

List<User> userList = userMapper.selectList(null);

出现了空指针错误,看起来是找不到 userMapper

从报错输出来看,连 Springboot 都没启动,那么问题可能与 Spring Boot 测试环境未能正确初始化有关,解决方法如下:

2.1 方法一:使用 @RunWith 注解

  • 在 JUnit 4 环境下,Spring Boot 测试类需要使用 @RunWith(SpringRunner.class) 注解来引导测试环境的加载

  • 由于测试环境未正确加载,UserMapper bean未能成功注入,因此在执行 userMapper.selectList(null) 时抛出了NullPointerException

  • 修改后完整代码如下

    添加了 @RunWith(SpringRunner.class) 注解这行

import com.thr.usercenter.mapper.UserMapper;
import com.thr.usercenter.model.User;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SampleTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        // 查询所有
        List<User> userList = userMapper.selectList(null);
        // 这里判断查出来的是否有五条数据
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}
  • pom.xml中的 junit4 依赖:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
  • 运行成功:

2.2 方法二:使用 JUnit 5

  • 其实在 Spring Boot 2.2 以上的版本,就已经集成了 JUnit 5,不需要使用@RunWith注解,简化了测试环境的配置和bean注入过程

  • 修改为 JUnit 5 的操作

    • 只需要 spring-boot-starter-test 依赖,所以不需要修改 pom.xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    • 使用org.junit.jupiter.api.Test替换org.junit.Test
    • 使用org.junit.jupiter.api.Assertions替换org.junit.Assert
  • 修改后完整代码如下

import com.thr.usercenter.mapper.UserMapper;
import com.thr.usercenter.model.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
public class SampleTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        // 查询所有
        List<User> userList = userMapper.selectList(null);
        // 这里判断查出来的是否有五条数据
        Assertions.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}

3. 总结

JUnit版本差异

  • JUnit 4 和 JUnit 5 在集成 Spring Boot 测试时的要求有所不同。JUnit 5 提供了更简洁的测试环境配置方式,与 Spring Boot 的集成更加自然,而 JUnit 4 则需要额外的配置。

标签:SpringBoot,JUnit,userList,org,test,import,junit,测试环境
From: https://www.cnblogs.com/thr-0103/p/17994858

相关文章

  • SpringBoot实现动态数据源配置
    场景描述:前一阵子接手的新项目中需要使用2个数据源。一个叫行云数据库,一个叫OceanBase数据库。就是说,我有时候查询要查行云的数据,有时候查询要查OceanBase的数据,咋办?废话不多说,下面以mysql为例,开整。一、环境依赖<dependency><groupId>org.springframework.boot</gr......
  • 【SpringBoot】当AOP引发的异常与@RestControllerAdvice擦肩而过:异常处理的盲点揭秘
    各位上午/下午/晚上好呀!今天在写bug的时候发现一个这样的问题:AOP抛出的异常竟然没有被@RestControllerAdvice注解修饰的异常统一处理类处理。 需求是这样子滴:对某些加了自定义注解的方法进行切面处理,通过条件判断是否有权限执行该方法。伪代码大概长这个样子:@Around(......
  • SpringBoot统一结果返回,统一异常处理,大牛都这么玩
    引言在开发SpringBoot应用时,我们经常面临着不同的控制器方法需要处理各种不同类型的响应结果,以及在代码中分散处理异常可能导致项目难以维护的问题。你是否曾经遇到过在不同地方编写相似的返回格式,或者在处理异常时感到有些混乱?这些看似小问题的积累,实际上可能对项目产生深远的......
  • 新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅
    介绍在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面。SpringBoot提供了强大的数据验证机制,使开发者能够轻松地执行验证操作。本文将深入介绍SpringBoot中的Validation,以及如何在应用程序中正确使用它。为什么使用数据验证?1.用户输......
  • SpringBoot + SpEL,轻松搞定复杂权限控制
    对于在Springboot中,利用自定义注解+切面来实现接口权限的控制这个大家应该都很熟悉,也有大量的博客来介绍整个的实现过程,整体来说思路如下:自定义一个权限校验的注解,包含参数value配置在对应的接口上定义一个切面类,指定切点在切入的方法体里写上权限判断的逻辑乍一看,没毛病,学......
  • springboot中@Repository 和 @Mapper的区别
    在springboot中他们两都是数据访问层的注解(在定义方面)@Repository:@Repository注解通常用于对DAO(DataAccessObject)组件进行标识。它告诉Spring框架,被注解的类是用于数据访问的组件,可以通过Spring的组件扫描机制自动注册为SpringBean,并且可以将底层的数据访问异......
  • SpringBoot日志配置
    1.简介Spring使用spring5及以后commons-logging被spring直接自己写了。支持log4j2,logback是默认使用的。虽然日志框架很多,但是我们不用担心,使用SpringBoot的默认配置就能工作的很好。 SpringBoot怎么把日志默认配置好的1、每个starter场景,都会导入一个核心场景......
  • 如何改Maven Dependencies的源码,如何把springboot组件的源码改造后使用
    由于springboot提供的源码有些地方不太符合预期,所以需要改动改动,这里就会说到,如何改MavenDependencies的源码。如何把springboot组件的源码改造后使用。v修改源码的几种方式直接在自己工程中建同包同类名的类进行替换采用@Primary注解排除需要替换的jar包中的类@Bean......
  • Springboot CRUD简单实现
    SpringBoot对Spring的改善和优化,它基于约定优于配置的思想,提供了大量的默认配置和实现使用SpringBoot之后,程序员只需按照它规定的方式去进行程序代码的开发即可,而无需再去编写一堆复杂的配置SpringBoot的主要功能如下:起步依赖:SpringBoot以功能化的方式将需要的依赖进行组装,并......
  • SpringBoot启动过程中发布的事件
    springboot启动过程中会发布的事件(启动类的run()方法执行时)ApplicationStartingEvent:应用运行开始事件SpringBoot运行run()方法未进行任务操作时先发布此事件ApplicationEnvironmentPreparedEvent:Environment准备完成事件在Environement准备完成且应用上下文context......