報(bào)錯(cuò)信息
java.lang.NullPointerException
空指針異常
空對(duì)象引用
來(lái)源
對(duì)Controller層進(jìn)行單元測(cè)試,解決完Spring上下文報(bào)錯(cuò)后繼續(xù)報(bào)錯(cuò)。
解決
在測(cè)試方法執(zhí)行前要為字段完成對(duì)象的注入,否則就報(bào)空指針異常。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-771389.html
測(cè)試?yán)?/h4>
不完整啟動(dòng)Spring框架
public class SysUserControllerTest {
@InjectMocks// 在單元測(cè)試中沒(méi)有啟動(dòng)Spring框架時(shí),通過(guò)@InjectMocks完成依賴(lài)注入
private SysUserController sysUserController;
@Mock// 創(chuàng)建模擬對(duì)象
private SysUserService sysUserService;
@BeforeEach// JUnit5 棄用Before,每個(gè)測(cè)試方法執(zhí)行之前初始化測(cè)試環(huán)境
public void setUp() {
MockitoAnnotations.openMocks(this);// 初始化被@Mock、@Spy、@Captor 和 @InjectMocks 注解的字段
}
@Test
public void testSelectOne() throws Exception {
// 準(zhǔn)備測(cè)試數(shù)據(jù)
Serializable id = 1;
SysUser sysUser = new SysUser();
sysUser.setId(1L);
sysUser.setUserName("admain");
// 設(shè)置mock對(duì)象行為
// 設(shè)置sysUserService的 getById 方法的返回值為 sysUser
when(sysUserService.getById(id)).thenReturn(sysUser);
// 調(diào)用被測(cè)試的方法
// 調(diào)用 sysUserController 的 selectOne 方法,并傳入 id 參數(shù)
ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);
// 如果 responseResult 的 Code 字段等于 200
// if (responseResult.getCode() == 200) {
// // 打印 responseResult 的 JSON 字符串形式
// System.out.println(JSON.toJSONString(responseResult));
// }
// 斷言驗(yàn)證結(jié)果
assert (responseResult.getData().getUserName().equals(sysUser.getUserName()));
}
}
完整啟動(dòng)Spring框架
public class SysUserControllerTest {
@InjectMocks// 在單元測(cè)試中沒(méi)有啟動(dòng)Spring框架時(shí),通過(guò)@InjectMocks完成依賴(lài)注入
private SysUserController sysUserController;
@Mock// 創(chuàng)建模擬對(duì)象
private SysUserService sysUserService;
@BeforeEach// JUnit5 棄用Before,每個(gè)測(cè)試方法執(zhí)行之前初始化測(cè)試環(huán)境
public void setUp() {
MockitoAnnotations.openMocks(this);// 初始化被@Mock、@Spy、@Captor 和 @InjectMocks 注解的字段
}
@Test
public void testSelectOne() throws Exception {
// 準(zhǔn)備測(cè)試數(shù)據(jù)
Serializable id = 1;
SysUser sysUser = new SysUser();
sysUser.setId(1L);
sysUser.setUserName("admain");
// 設(shè)置mock對(duì)象行為
// 設(shè)置sysUserService的 getById 方法的返回值為 sysUser
when(sysUserService.getById(id)).thenReturn(sysUser);
// 調(diào)用被測(cè)試的方法
// 調(diào)用 sysUserController 的 selectOne 方法,并傳入 id 參數(shù)
ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);
// 如果 responseResult 的 Code 字段等于 200
// if (responseResult.getCode() == 200) {
// // 打印 responseResult 的 JSON 字符串形式
// System.out.println(JSON.toJSONString(responseResult));
// }
// 斷言驗(yàn)證結(jié)果
assert (responseResult.getData().getUserName().equals(sysUser.getUserName()));
}
}
避免手動(dòng)注入字段。
注意:完整啟動(dòng)的話->Mockito測(cè)試框架中來(lái)模擬一個(gè)對(duì)象的行為會(huì)失效(when()失效)。
通常不這樣測(cè)試,如果需要在單元測(cè)試中模擬Spring Boot應(yīng)用程序的某些功能,可以考慮使用@SpringBootTest
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-771389.html
@SpringBootTest
public class SysUserControllerTest {
@Autowired// @SpringBootTest完整啟動(dòng)Spring框架時(shí),通過(guò)@Autowired完成依賴(lài)注入
private SysUserController sysUserController;
@Mock// 創(chuàng)建模擬對(duì)象
private SysUserService sysUserService;
@Test
public void testSelectOne() throws Exception {
// 準(zhǔn)備測(cè)試數(shù)據(jù)
Serializable id = 1;
SysUser sysUser = new SysUser();
sysUser.setId(1L);
sysUser.setUserName("admain");
// 設(shè)置mock對(duì)象行為
// 設(shè)置sysUserService的 getById 方法的返回值為 sysUser
when(sysUserService.getById(id)).thenReturn(sysUser);
// 調(diào)用被測(cè)試的方法
// 調(diào)用 sysUserController 的 selectOne 方法,并傳入 id 參數(shù)
ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);
// 如果 responseResult 的 Code 字段等于 200
// if (responseResult.getCode() == 200) {
// // 打印 responseResult 的 JSON 字符串形式
// System.out.println(JSON.toJSONString(responseResult));
// }
// 斷言驗(yàn)證結(jié)果
assert (responseResult.getData().getId().equals(sysUser.getId()));
}
}
到了這里,關(guān)于單元測(cè)試-java.lang.NullPointerException的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!