2016-08-25 48 views
2

我經常創建包含某種集合(集合,列表,任何)的對象。他們永遠不能爲空。如果null由構造函數或setter傳遞,則創建空集合的新實例。這裏是一個錯誤的例子(由評論標記)。所有集合都不能爲空的單元測試的通用方法

package com.myapp; 

import com.google.common.collect.Lists; 

import java.util.List; 

public class MyClass { 
    private List<String> myNeverNullList1; 
    private List<String> myNeverNullList2; 

    public MyClass(List<String> myNeverNullList1, List<String> myNeverNullList2) { 

     this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1; 
     this.myNeverNullList2 = myNeverNullList2==null? Lists.newArrayList():myNeverNullList2; 
    } 

    public void setMyNeverNullList1(List<String> myNeverNullList1) { 
     this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1; 
    } 

    public void setMyNeverNullList2(List<String> myNeverNullList2) { 
     //OOPS, I forgot to put the null check here, should be caught by Unit Tests 
     this.myNeverNullList2 = myNeverNullList2; 
    } 
} 

我通過單元測試,測試在單元測試這種行爲,但它是乏味寫出這樣簡單的測試,爲每個集合。有沒有圖書館,可以幫助我自動測試這種行爲?

+0

這可能會幫助你。 http://stackoverflow.com/questions/11152536/check-if-a-collection-is-empty-in-java-which-is-the-best-method –

+0

你需要單獨測試你所有的設備,這麼久故事短 - 沒有,沒有通用的方式來驗證你的應用程序中的所有集合不是null。如果您有2個或N個需要驗證的集合,則需要編寫2個或N個斷言。 –

+0

你真的需要替換整個列表嗎?根據這種操作的可能副作用,對我來說這似乎非常危險...... – Spotted

回答

1

您可以使用反射來生成測試。例如你可以有一個類的列表,檢查構造函數和實例方法在setter上尋找集合,並檢查它們的行爲如何,當你通過一個null值。一旦你編寫了測試,你所需要的就是這個檢查應該應用到的所有類的列表。

2

通用的答案是:讓你的領域最終做不是允許它以後。然後編譯器會執行所有檢查你的操作。 換句話說:默認情況下,使您的政策的對象是不可變的;只有你有很好的理由纔會偏離該政策。

如果有很多理由在你的班級中有多個「可設置」列表 (老實說:我想不出),那麼下一個最好的做法是編寫一個「僅測試」反射實用程序它使用反射來獲取所有具有匹配setter的列表/集合字段......首先用null調用setter,然後檢查字段是否爲空。

相關問題