簡體   English   中英

Junit 測試 model class

[英]Junit test for model class

這個問題是關於最佳實踐而不是任何問題。 我正在嘗試測試下面的服務方法。 myDAO 是 DAO class,它將被注入並具有所有數據庫調用代碼。

public List<MyObject> getMyObject(String inputParameter){
    List<MyObject> objectList = myDAO.getObjectList(inputParameter);
    return objectList 
}

而我的 Junit 測試用例使用 mockito 是

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest{
    @InjectMocks
    MyClass myClass;

    @Mock
    MyDAO myDAO;

    private MyObject myObj;
    private List<MyObject> objList;

    @Before
    public void setUp() throws Exception {  
        myObj = new MyObject();
        myObj.setQuantity(10);
        //I am calling all setter method to prepare myObj here
        objList = new ArrayList<MyObject>();
        objList.add(myObj); 

        when(myDAO.getObjectList(any(InputParameter.class))
                                                    .thenReturn(objList);    
    }


    @Test
    public void testGetMyObject(){

        List<MyObject> result =  myClass.getMybject(null);
        assertThat(" Quantity should return 10", result.getQuantity(), is(10));
        // and all asserts....
    }

一切都很好並且工作正常。 我這里的主要問題是 MyObject 是一個帶有 200 個參數的模態 class。

現在為了代碼覆蓋,我必須在准備對象時調用 200 個 setter 方法,並斷言 200 個 getter 方法用於 junit 測試。 我認為這不是一個好主意。 什么是更好的做法以及如何在單元測試代碼覆蓋率上覆蓋這種模式 class。

1)在單個類中定義的200個字段意味着真正的設計問題。
即使是模型類也沒有擁有這么多領域。

2)你的測試實際上沒有測試。
您的測試的單一邏輯是:

List<MyObject> objectList = myDAO.getObjectList(inputParameter);

但你嘲笑DAO的調用。
最后,您只測試getter / setter方法。

我認為以單一的觀點測試這個類並不是很重要。
您應該在集成測試的框架中測試此類,其中DAO不會被模擬。

此外,如果您從頂層測試它,您還可以使用更簡潔的方法來設置測試的固定,因為客戶端類不會填充所有這些單一數據。
例如,它可以從fixture SQL腳本提供。

關於編寫單元測試用例的最佳實踐一直存在巨大爭議。 所以對於這類問題,不會有明確的答案。 對我來說,為getter和setter編寫測試用例只是為了使代碼覆蓋百分比高是愚蠢的。 但有時您的選擇和您的偏好不計算在內。

盡管您的代碼需要重構,但您可以使用一些API來簡化您的工作。 SmartUnit就是其中之一,您可以使用它來測試您的POJO。 這些API允許您只在場景后面編寫幾行,覆蓋所有getter / setter代碼覆蓋率。

為什么不直接使用 lombok 來生成 getter/setter 樣板代碼。 這樣您就不必擔心 POJO 類的覆蓋百分比。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM