使用dbunit測試spring + mybatis的資料庫應用

johnchou發表於2021-09-09

單元測試對提高程式質量的作用毋庸置疑, 本文將用實際的例子來介紹如何測試面向資料庫的應用程式。  剛接觸單元測試的同學常常會疑惑什麼東西需要測試什麼東西不需要測試, 而對於面向資料庫的程式,  我們的主要邏輯往往是在sql上,我們寫了很多sql語句來完成應用需要的操作, sql語句執行是否正確和應用是否正確關聯性極強。  對於這類程式我們可以用dbunit來做測試。

本文介紹如何使用dbunit來測試spring + mybatis這種訪問資料庫的框架組合。

我用一個簡單的demo來介紹如何做資料庫的單元測試,專案的結構如下:

圖片描述

下面我逐個介紹專案中涉及dbunit單元測試的部分,  首先是我們新建了一個maven專案,要在此專案中做dbunit的單元測試,我們需要在pom檔案中引用spring-test, junit,  dbunit,以及h2相關的maven依賴,  spring-test用來載入spring配置檔案,h2用來模擬mysql執行sql語句,這裡我們不用mysql或者其他資料庫,而是用記憶體資料庫h2,這是出於兩個原因考慮的,一是h2是記憶體資料庫,測試執行起來更快;  二是h2是java內建資料庫,不管是在什麼環境下,只要有java,測試用例就可以跑起來, 不必連真正的資料庫。

pom.xml檔案中新增的單元測試相關依賴項如下:

                     junit             junit             ${junit.version}             test                               org.dbunit             dbunit             ${dbunit.version}             test                               org.springframework             spring-test             ${spring.version}             test                               com.h2database             h2             ${h2.version}             test         

 下一步我們定義了NoteDao介面,在這個介面中有對Note表相關的添查改刪操作的方法, 然後我們在NoteMapper中寫了四個方法對應的sql語句,這些內容和我們平時使用mybatis沒什麼兩樣,這裡不做詳述。

我們在src/test/java中新增NoteDaoTest類,用來測試NoteDao類,此類的內容如下,請注意看註釋:

package hello; import cn.outofmemory.dbunit.dao.NoteDao; import cn.outofmemory.dbunit.entity.Note; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Date; /**  * NoteDao實現的測試類  *  * 這個類必須有@RunWith(SpringJUnit4ClassRunner.class)直接指定使用spring測試, @ContextConfiguration 註解指定要使用此單元測試類需要預先載入的spring配置檔案  *  * Created by yukaizhao on 2015/10/26.  */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"/spring/spring-dao.xml"}) public class NoteDaoTest {     /**      * 使用@Autowired註解自動注入NoteDao測試類      */     @Autowired     private NoteDao noteDao;     /**      * 測試NoteDao的insert方法, 此處我們構造了一個Note物件,然後將起insert到資料庫      */     @Test     public void insertTest() {         Note note = new Note();         note.setTitle("test title");         note.setContent("test content");         note.setCreateTime(new Date());         noteDao.insert(note);         //此處透過驗證note的id屬性是否為正整數來驗證插入是否成功         Assert.assertTrue(note.getId() > 0);     }     /**      * 測試更新操作      */     @Test     public void updateTest() {         Note note = new Note();         note.setId(1);         String newTitle = "new Title";         note.setTitle(newTitle);         String newContent = "new Content";         note.setContent(newContent);         int effectRows = noteDao.update(note);         //此處透過update操作返回的受影響行數來斷定update操作是否執行成功         Assert.assertTrue (effectRows == 1);     }     /**      * 測試delete操作      */     @Test     public void deleteTest() {         int wantDeleteId = 2;         int effectRows = noteDao.delete(wantDeleteId);         //透過驗證受影響行數來斷定是否成功執行操作         Assert.assertEquals(1, effectRows);     } 
    /**      * 測試select操作      */     @Test     public void selectTest() {         int selectId = 3;         Note note = noteDao.selectNoteById(selectId);         //透過select出的note的id屬性來斷言是否成功         Assert.assertEquals(selectId, note.getId());     } }

這裡的所有測試都需要初始化資料庫,並且在資料庫中初始化一些資料來做測試操作,這個初始化的操作,是在src/test/resources/spring/spring-dao.xml檔案中定義的,我們看下spring-dao.xml檔案中測試資料來源定義和測試資料初始化bean定義的內容:

                                         
         
     

上面的dataSource Bean的driverClassName是org.h2.Driver,  而url是h2的記憶體資料庫的url連線。 在jdbc:initialize-database  bean中定義了在資料庫的初始階段要執行兩個指令碼sql/ddl.sql和dml.sql兩個指令碼。

經過這些配置之後,你就可以執行spring+mybatis的單元測試了,我們秀一個測試結果

圖片描述

4個方法全部測試透過。

我們總結下使用dbunit測試spring+mybatis應用的db操作步驟,  首先要配置pom檔案引入必要依賴,然後需要在src/test/resources中新增spring配置檔案,定義測試所需要的資料來源和資料庫初始化,  然後需要在寫單元測試時在初始化sql中新增必要的資料表定義和資料初始化指令碼。

最後為大家奉上整個demo專案, 文中未盡事宜,請透過demo專案瞭解,如果還有不解之處,請留言探討。

hello-j.zip

原文連結:outofmemory.cn/Java/test-spring-mybatis-database-application-with-dbunit

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2805465/,如需轉載,請註明出處,否則將追究法律責任。

相關文章