报错信息

java.lang.NullPointerException 空指针异常 空对象引用

来源

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

解决

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

测试例子

不完整启动Spring框架

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 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

@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 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()));

}

}

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。