這周主要是項目字段增長軟刪除,當一個項目的字段關係變得很是複雜時,想要刪除一條數據每每由於牽扯過多數據而變得難以刪除,這時就用到了咱們的軟刪除。軟刪除並非真正的刪除,而是將原有數據設置的deleted字段變爲true。當查詢數據時,忽略掉deleted字段爲true的數據。也就是說,軟刪除並非真正的刪除,而是將其保留,當查詢數據時,根據一個設置的boolean字段進行判斷本條數據是否已經刪除,已經刪除的數據再也不被各個功能查到。
在進行單元測試時,當在一個方法加入對軟刪除的測試時,斷言預期結果與正常結果不一致。git
1.初步檢查了前面進行的軟刪除對倉庫層方法與實體的修改,並無問題。
2.單純的看代碼並非有效的解決問題的方式。有效解決問題還要看執行代碼過程當中各字段的變化。讓咱們在刪除後輸出一下course的deleted字段究竟是什麼,github
System.out.println(course.isDeleted());
輸出false
固然false並非咱們預想中的答案。
爲了驗證我先在別的已經過方法上進行實驗,分別看看刪除先後deleted字段的變化。由於若是是delete()方法的問題,別的單元測試刪除先後deleted字段就不會改變。
刪除先後都爲false,可是單元測試居然過了,這讓我感到了奇怪。這並不符合個人預期。帶着疑惑請教了老師。老師讓我在倉庫層創建一個findById(Long id)方法,經過findById方法從數據庫找出來,而後觀察deleted字段的值。數據庫
ourse = this.courseRepository.findByIdAndDeletedIsTrue(course.getId()).get(); System.out.println(course.isDeleted());
爲何直接輸出course的deleted值是false,而從數據庫查詢到的course的deleted值是true呢。 讓咱們經過debug來一探究竟。
經過對比先後兩個course得知,這是兩個course對象,也就是說,咱們在單元測試中操做的course和數據庫中的course是兩個course對象,咱們delete方法僅對數據庫中的course進行了操做,因此形成了當前結果.
咱們經過代碼更能說明問題,斷言兩個course相等:segmentfault
弄清楚了這些,我應當修改我一開始的輸出方法。當我嘗試改正輸出的course時,遇到了新的錯誤單元測試
System.out.println(this.courseRepository.findByIdAndDeletedIsTrue(course.getId()).get().isDeleted());
大概意思就是不存在。
經過輸出id得知,原來我獲得了一個不能用的id.
看來是這個id引發的。幾乎一樣的初始化數據操做,爲何上一個單元測試沒有報錯呢,經過debug得知,
當們在37行獲取一個course時,咱們的course的id值仍是一個隨意數,當咱們在37行保存後,咱們的保存的course纔會有一個正常的id值,而兩個測試的關鍵在於39行,沒報錯的如圖所示有course =
,而報錯的並無course =
因此id仍是創造出來的隨機值。天然而然咱們對於這個course進行delete也就無濟於事,並不會對數據庫中的course影響。也就產生了一開始的問題。測試
有時候咱們想象的東西,並不必定是正確的,這就須要咱們一步步去驗證,實踐纔是檢驗理論的惟一標準。this
本文做者: 河北工業大學夢雲智開發團隊 - 趙凱強