java中Jar方法的单元测试

时间:2016-04-15 04:57:18

标签: java junit apache-poi mockito stub

我正在使用Apache POI方法在java中写入Excel工作表。我必须对我编写的方法进行单元测试。我使用了许多Apache POI方法。我应该存根Apache POI的不同对象类的所有方法吗?

示例:我已经创建了使用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();
  }

} 

我是否应该模拟Row类的getRowthe Sheet.class的{​​{1}}等方法?

1 个答案:

答案 0 :(得分:3)

测试结果,而不是实施。

即。如果我写一个单元格,我现在可以从该单元格中读取该值吗?

此外,您向我们展示了protected方法,您只需要测试类的公共接口。如果您无法通过公共界面查看结果,那么您的课程可能做得太多(单一责任原则)。

然而,其他考虑因素是速度和脆弱性,因为Apache POI正在读取和写入实际文件,编写这些测试会有点困难,而且速度会慢一些。可以进行一些测试,但是如果整个套件正在读取和写入文件,那么它会变慢,整个测试套件应该在几秒钟内完成。

所以我会创建一个封装excel表的接口以及你想用它做什么,这可能是:

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

现在我可以在没有自动化测试的情况下快速实现,或者只是围绕Apache POI进行一些简单的测试,但是我的套件的其余部分将针对StringGridpublic 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(); } } 的{​​{3}}实现进行测试可以围绕我的代码创建大量快速运行测试。

所以这些看起来像:

真正的实现,仅在其测试和实时程序中使用。

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); } } 实现),适用于所有其他测试:

pophoto

这有额外的好处,你可以稍后换掉另一个的实时实现,也许使用其他POI方法之一甚至谷歌表实现,你只需要添加一些测试和一个新的实现,并赢得'需要修改任何代码(开放封闭原则)。