如何用iis部署網(wǎng)站網(wǎng)絡(luò)游戲推廣公司
報(bào)錯(cuò)信息
java.lang.NullPointerException
空指針異常
空對(duì)象引用
來源
對(duì)Controller層進(jìn)行單元測(cè)試,解決完Spring上下文報(bào)錯(cuò)后繼續(xù)報(bào)錯(cuò)。
解決
在測(cè)試方法執(zhí)行前要為字段完成對(duì)象的注入,否則就報(bào)空指針異常。
測(cè)試?yán)?/h4>
不完整啟動(dòng)Spring框架
public class SysUserControllerTest {@InjectMocks// 在單元測(cè)試中沒有啟動(dòng)Spring框架時(shí),通過@InjectMocks完成依賴注入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 注解的字段}@Testpublic 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 方法的返回值為 sysUserwhen(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è)試中沒有啟動(dòng)Spring框架時(shí),通過@InjectMocks完成依賴注入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 注解的字段}@Testpublic 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 方法的返回值為 sysUserwhen(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è)試框架中來模擬一個(gè)對(duì)象的行為會(huì)失效(when()失效)。
通常不這樣測(cè)試,如果需要在單元測(cè)試中模擬Spring Boot應(yīng)用程序的某些功能,可以考慮使用@SpringBootTest
@SpringBootTest
public class SysUserControllerTest {@Autowired// @SpringBootTest完整啟動(dòng)Spring框架時(shí),通過@Autowired完成依賴注入private SysUserController sysUserController;@Mock// 創(chuàng)建模擬對(duì)象private SysUserService sysUserService;@Testpublic 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 方法的返回值為 sysUserwhen(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()));}
}