Spring 異常單元測試的解決
白盒測試,要求對代碼中的每行代碼至少覆蓋一次。
@ApiModelProperty("學(xué)科類別") @ManyToOne // 設(shè)置學(xué)科類別字段不能為空 @JoinColumn(nullable = false) @JsonView({NoneJsonView.class, MeasurementUnitCategoryJsonView.getAllByDisciplineId.class}) private Discipline discipline;
以之前對學(xué)科設(shè)置不為空為例,我們需要測試兩種情況,為空時的異常和不為空時保存正常。
@Test public void saveTest() { logger.debug("新建計量單位類別"); MeasurementUnitCategory measurementUnitCategory = new MeasurementUnitCategory(); logger.debug("測試保存"); measurementUnitCategoryService.save(measurementUnitCategory); }
這里我們調(diào)用了save
方法,但是IDE
并沒有提示我們需要捕獲異常,但是并不代表這個save
方法不拋出異常,可以拋出非檢查的RuntimeException
或其派生的異常。
為了測試這個異常,我們首先運行這行代碼,看看出現(xiàn)什么異常。
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "DISCIPLINE_ID"; SQL statement:
insert into measurement_unit_category (id, discipline_id, is_asc) values (null, ?, ?) [23502-194]
我們看到有三個異常,先是插入這條記錄時的JdbcSQLException
,然后該異常引起了ConstraintViolationException
,新異常又引起了DataIntegrityViolationException
。
這個Caused by
其實是異常的一種封裝,比如說底層,可能會拋出異常,但是我們一般都是在比較高的層面去處理異常。
就拿這個來舉例子,DataIntegrityViolationException
數(shù)據(jù)違反異常,很多種可能都會產(chǎn)生這種異常,所以這種異常的處理方法都是相同或類似的。
當(dāng)?shù)讓訏伋隽艘粋€JdbcSQLException
,然后調(diào)用它的方法就catch
了這個異常,并用該異常構(gòu)建了一個新的異常ConstraintViolationException
(限制違反異常),然后再向上層拋出,再到上層捕獲,構(gòu)建新異常DataIntegrityViolationException
并拋給了我們,我們沒有處理,然后控制臺就報錯了。
這樣一直封裝向上拋的好處就是我可以用一個異常來處理一類相似的情況,然后在處理這個異常的時候可以追根溯源,一直精確到是由什么引起的。如果沒有這個封裝的話,那我們需要直接去catch
底層的異常才能精確地定位到錯誤。
好了,我們這里需要捕獲的異常就是應(yīng)用拋給我們的DataIntegrityViolationException
異常。
@Test public void saveTest() { logger.debug("基礎(chǔ)測試數(shù)據(jù)準(zhǔn)備"); MeasurementUnitCategory measurementUnitCategory = new MeasurementUnitCategory(); Boolean catchException = false; logger.debug("測試保存,期待拋出異常"); try { measurementUnitCategoryService.save(measurementUnitCategory); } catch (DataIntegrityViolationException e) { catchException = true; } logger.debug("斷言捕獲異常為真"); assertThat(catchException).isTrue(); }
運行測試,通過。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java動態(tài)規(guī)劃方式解決不同的二叉搜索樹
二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下2022-10-10Android、iOS和Java通用的AES128加密解密示例代碼
現(xiàn)在很多App在與服務(wù)器接口的請求和響應(yīng)過程中,為了安全都會涉及到加密和解密的問題,如果不加的話就會是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時有Android和IOS的App的話、必須要保證加密和解密的算法一致、不然后臺沒法處理,下面通過這篇文章學(xué)習(xí)下。2016-11-11使用Shiro實現(xiàn)登錄成功后跳轉(zhuǎn)到之前的頁面
這篇文章主要介紹了如何使用Shiro實現(xiàn)不同用戶登錄成功后跳轉(zhuǎn)到不同主頁,實現(xiàn)此功能目前比較好的方法是用ajax的方法登錄,第二種方法是把用戶未登錄前的url存在session中,需要的朋友可以參考下2015-07-07SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名操作
這篇文章主要介紹了SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法
這篇文章主要介紹了java實現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02SpringBoot整合token實現(xiàn)登錄認(rèn)證的示例代碼
本文主要介紹了SpringBoot整合token實現(xiàn)登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07