单元测试-java.lang.NullPointerException

报错信息

java.lang.NullPointerException

空指针异常

空对象引用

来源

Controller层进行单元测试,解决完Spring上下文报错后继续报错。

解决

在测试方法执行前要为字段完成对象的注入 ,否则就报空指针异常。

测试例子

不完整启动Spring框架
java 复制代码
public class SysUserControllerTest {

    @InjectMocks// 在单元测试中没有启动Spring框架时,通过@InjectMocks完成依赖注入
    private SysUserController sysUserController;

    @Mock// 创建模拟对象
    private SysUserService sysUserService;

    @BeforeEach// JUnit5 弃用Before,每个测试方法执行之前初始化测试环境
    public void setUp() {
        MockitoAnnotations.openMocks(this);// 初始化被@Mock、@Spy、@Captor 和 @InjectMocks 注解的字段
    }

    @Test
    public void testSelectOne() throws Exception {
        // 准备测试数据
        Serializable id = 1;
        SysUser sysUser = new SysUser();
        sysUser.setId(1L);
        sysUser.setUserName("admain");
        // 设置mock对象行为
        // 设置sysUserService的 getById 方法的返回值为 sysUser
        when(sysUserService.getById(id)).thenReturn(sysUser);
        // 调用被测试的方法
        // 调用 sysUserController 的 selectOne 方法,并传入 id 参数
        ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);
        // 如果 responseResult 的 Code 字段等于 200
//        if (responseResult.getCode() == 200) {
//            // 打印 responseResult 的 JSON 字符串形式
//            System.out.println(JSON.toJSONString(responseResult));
//        }
        // 断言验证结果
        assert (responseResult.getData().getUserName().equals(sysUser.getUserName()));
    }
}
完整启动Spring框架

避免手动注入字段。
注意 :完整启动的话->Mockito测试框架中来模拟一个对象的行为会失效(when()失效)。

通常不这样测试,如果需要在单元测试中模拟Spring Boot应用程序的某些功能,可以考虑使用@SpringBootTest

java 复制代码
@SpringBootTest
public class SysUserControllerTest {
    @Autowired// @SpringBootTest完整启动Spring框架时,通过@Autowired完成依赖注入
    private SysUserController sysUserController;

    @Mock// 创建模拟对象
    private SysUserService sysUserService;

    @Test
    public void testSelectOne() throws Exception {
        // 准备测试数据
        Serializable id = 1;
        SysUser sysUser = new SysUser();
        sysUser.setId(1L);
        sysUser.setUserName("admain");
        // 设置mock对象行为
        // 设置sysUserService的 getById 方法的返回值为 sysUser
        when(sysUserService.getById(id)).thenReturn(sysUser);
        // 调用被测试的方法
        // 调用 sysUserController 的 selectOne 方法,并传入 id 参数
        ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);
        // 如果 responseResult 的 Code 字段等于 200
//        if (responseResult.getCode() == 200) {
//            // 打印 responseResult 的 JSON 字符串形式
//            System.out.println(JSON.toJSONString(responseResult));
//        }
        // 断言验证结果
        assert (responseResult.getData().getId().equals(sysUser.getId()));
    }
}
相关推荐
爬山算法16 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.28 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农30 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧30 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..31 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy34 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇40 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
团子的二进制世界1 小时前
G1垃圾收集器是如何工作的?
java·jvm·算法
long3161 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习