2016-04-15 108 views
1

我正在使用Apache POI方法寫入Excel中的工作表。我必須爲我寫的方法進行單元測試。我使用了很多Apache POI的方法。我應該存儲Apache POI的不同對象類的所有方法嗎?Java中Jar方法的單元測試

示例:我創建了用於寫入使用Apache POI方法的單元格的包裝方法。

protected void writeCell(int rowNum, int colNum, String value, Sheet sheet) 
{ 
    if(value == null) 
    { 
     return; 
    } 
    Row row = sheet.getRow(rowNum); 
    Cell cell = row.createCell(colNum); 
    cell.setCellValue(); 
    } 

} 

我應該嘲笑甚至像的the Sheet.classgetRow和Row類的createCell的方法呢?

+1

你不必爲Apache POI方法進行單元測試,你只需要模擬它們。也只模擬你使用的方法不是全部 –

+0

@KP我沒有編寫Apache POI的測試用例。我正在寫我自己的方法。 – Ashley

回答

3

測試結果,未執行。

I.e.如果我寫一個單元格,我現在可以從該單元格中讀取該值嗎?

另外,您向我們展示了protected方法,您只需要測試類的公共接口。如果通過公共接口看不到結果,那麼你的課程可能會做得太多(單一責任原則)。

但是,其他考慮因素是速度和脆弱性,因爲Apache POI正在讀取和寫入實際文件,所以編寫這些測試會比較困難,而且速度會變慢。可以進行一些測試,但是如果整個套件正在讀取和寫入文件,那麼速度會變慢,並且整個測試套件在理想情況下應該在幾秒鐘內運行。

因此,我將創建一個封裝了一個Excel工作表,你想用它做什麼的接口,這可能是:

public interface StringGrid { 
    String readCell(int rowNum, int colNum); 
    void writeCell(int rowNum, int colNum, String value); 
} 

現在,我可能會做一個快速的實現沒有自動測試,或者只是少數圍繞Apache POI進行簡單的測試,但隨後我的套件的其餘部分將針對StringGridFake實現進行測試,並且我可以創建大量的快速運行測試,其中包含我的代碼。

所以這些可能看起來像:

真正實現,只有在它的測試和直播節目中使用。

public final class ApacheSheetStringGrid implements StringGrid { 

    private final Sheet theApacheSheet; 

    public ApacheSheetStringGrid(Sheet theApacheSheet) { 
     this.theApacheSheet = theApacheSheet; 
    } 

    public String readCell(int rowNum, int colNum){ 
     ... 
    } 

    public void writeCell(int rowNum, int colNum, String value) { 
     Row row = theApacheSheet.getRow(rowNum); 
     Cell cell = row.createCell(colNum); 
     cell.setCellValue(); 
    } 
} 

的假(一個工作,速度快,內存只有實現StringGrid),對於所有其他測試:

public final class FakeStringGrid implements StringGrid { 

    private final Map<String, String> contents = new HashMap<String, String>(); 

    private static String getKey(int rowNum, int colNum) { 
     return rowNum + ", " + colNum; 
    } 

    public String readCell(int rowNum, int colNum){ 
     return contents.get(getKey(rowNum, colNum)); 
    } 

    public void writeCell(int rowNum, int colNum, String value) { 
     contents.put(getKey(rowNum, colNum), value); 
    } 
} 

這有額外的好處,你可以在以後換出現場實施另外,也許使用其他POI方法之一,甚至谷歌表實現,你只需要添加一些測試和一個新的實現,並不需要修改任何代碼(開放封閉原則)。

+0

這是一個非常有效的解決方案。謝謝。我是否應該將所有方法(如writeCell(int rowNum,int colNum,String value))公諸於衆以用於測試它們?因爲那樣我就無法測試受保護的方法。 – Ashley

+0

那麼,如果你遵循這個方法,那些方法就會變成另一個類的「公共」。我*只*寫'公共'方法,我只*寫他們解決失敗的測試,在我的代碼'私人'和'保護'方法*只*通過[重構](http://blog.cleancoder。 COM /叔叔,鮑勃/ 2014/12/17/TheCyclesOfTDD.html)。 – weston

+0

「解決失敗的測試」是什麼意思?你是說你把所有的方法都寫成公共第一,然後再把更大的方法分解成更小的方法,而不是把它們變成私有/保護? – Ashley