2009-11-13 147 views
0

您將如何測試構建在持久性引擎上的超簡單方法?我將要使用JPA,但是我確信任何持久性機制都有其等價物。單元測試JPA /持久性通用

例如...

@Entity 
public class Category { 

    @Id @GeneratedValue 
    private long id; 

    @NotNull @NotEmpty 
    private String name; 

    @NotNull 
    @ManyToOne 
    private User user; 

    //...Getters/Setters... 
} 

@Stateless 
public void CategoryServiceImpl implements CategoryService { 

    @PersistenceContext EntityManager entityManager; 
    public void addCategory(Category input) { 
     entityManager.persist(input); 
    } 
} 

什麼樣的測試將用於addCategory是有用的。我可以看到TDD和單元測試的用處,但我不確定對於這樣的簡單方法要做什麼樣的測試。不是真的在尋找「如何」來創建測試,而是「測試什麼」。

回答

0

的一個理念是非常強硬的單元測試(之前,我解釋一下我的意思是,讓我說,我很少遵循這一理念我自己)。你正在測試這個單元做它應該做的事情,而不是任何依賴軟件(例如持久性機制)的工作。

所以你的這種方法接收一個參數「輸入」並將其傳遞給entityManager.persist。這是工作。所以我們使用某種類型的模擬框架來獲取一個模擬的entityManager,並且驗證傳遞給addCategory調用的參數是否會被我的entityManager所接收。而已。我們已經測試了該方法的所有責任。

在更復雜的情況下,這是appraoch非常有用,您測試的方法,所有的條件,拿起各種「減一」和濫用空引用錯誤等

對於像這個例子我不相信我們會找到有趣的錯誤。 所以我會使用一個真正的EntityManager來設置一些測試套件,這會推動數據的邊界。是的,這不是真正的「單元」測試,但我不在乎 - 我想找到缺陷!

例如:

Create a category object with an empty name 

Call Add Category 

應該發生什麼?我認爲我們打算拋出異常?所以我們測試確實發生了這種情況。

一些測試:

  1. 插入,然後檢索 - 驗證所有領域
  2. 插入,然後插入一個重複的,有什麼錯誤,請我們預計

等。

+0

在更廣泛的命名事物世界中,這會是「整合」測試嗎? – Drew 2010-01-07 21:13:55

+0

@德魯,是的,它是一種集成測試。我要說的是,考慮集成測試的常用方法更關心的是,我們剛剛開發,而不是基礎設施的代碼模塊整合。在這裏,我們可能會專注於單位的行爲,仔細研究其案例。 – djna 2010-01-07 22:32:02

0

,而不是針對現有的數據庫集成測試,你可以通過對嵌入在像已被用於創建基於連接的註釋所有的表H2內存數據庫運行測試執行體面的單元測試。對於我們來說,這對於大約兩百張表的數據庫來說效果很好。