溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring 異常單元測試的解決

發(fā)布時(shí)間:2020-10-06 18:34:40 來源:腳本之家 閱讀:147 作者:張喜碩 欄目:編程語言

白盒測試,要求對代碼中的每行代碼至少覆蓋一次。

@ApiModelProperty("學(xué)科類別")
@ManyToOne
// 設(shè)置學(xué)科類別字段不能為空
@JoinColumn(nullable = false)
@JsonView({NoneJsonView.class,
    MeasurementUnitCategoryJsonView.getAllByDisciplineId.class})
private Discipline discipline;

以之前對學(xué)科設(shè)置不為空為例,我們需要測試兩種情況,為空時(shí)的異常和不為空時(shí)保存正常。

@Test
public void saveTest() {
  logger.debug("新建計(jì)量單位類別");
  MeasurementUnitCategory measurementUnitCategory = new MeasurementUnitCategory();

  logger.debug("測試保存");
  measurementUnitCategoryService.save(measurementUnitCategory);
}

這里我們調(diào)用了save方法,但是IDE并沒有提示我們需要捕獲異常,但是并不代表這個(gè)save方法不拋出異常,可以拋出非檢查的RuntimeException或其派生的異常。

為了測試這個(gè)異常,我們首先運(yùn)行這行代碼,看看出現(xiàn)什么異常。

Spring 異常單元測試的解決

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.h3.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]

我們看到有三個(gè)異常,先是插入這條記錄時(shí)的JdbcSQLException,然后該異常引起了ConstraintViolationException,新異常又引起了DataIntegrityViolationException

這個(gè)Caused by其實(shí)是異常的一種封裝,比如說底層,可能會(huì)拋出異常,但是我們一般都是在比較高的層面去處理異常。

就拿這個(gè)來舉例子,DataIntegrityViolationException數(shù)據(jù)違反異常,很多種可能都會(huì)產(chǎn)生這種異常,所以這種異常的處理方法都是相同或類似的。

當(dāng)?shù)讓訏伋隽艘粋€(gè)JdbcSQLException,然后調(diào)用它的方法就catch了這個(gè)異常,并用該異常構(gòu)建了一個(gè)新的異常ConstraintViolationException(限制違反異常),然后再向上層拋出,再到上層捕獲,構(gòu)建新異常DataIntegrityViolationException并拋給了我們,我們沒有處理,然后控制臺就報(bào)錯(cuò)了。

這樣一直封裝向上拋的好處就是我可以用一個(gè)異常來處理一類相似的情況,然后在處理這個(gè)異常的時(shí)候可以追根溯源,一直精確到是由什么引起的。如果沒有這個(gè)封裝的話,那我們需要直接去catch底層的異常才能精確地定位到錯(cuò)誤。

好了,我們這里需要捕獲的異常就是應(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();
}

運(yùn)行測試,通過。

Spring 異常單元測試的解決

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI