在这种情况下编写可测试的代码

时间:2015-12-15 20:03:35

标签: java

我正在尝试确定编写可测试代码的最佳方法。这是我的代码

class FileReader {

    private FileInputStream input;

    public FileReader(FileInputStream input) {
        this.input = input;
    }

    public void read() throws IOException {
        Row row = readHeaderRow();
        Row[] rows = readOtherRowsBasedOnHeader(row);
        doSomethingElse(rows);
    }

    private void readHeaderRow() {
        //..
    }
    private void readOtherRowsBasedOnHeader(Row row) {
        //..
    }
    private void doSomethingElse(Row[] rows) {
        //..
    }
}

从上面可以看出,只有read()方法是公共的。其余的方法都是私人的。我应该让私人方法退出测试吗?或者将所有方法公开并执行read()在调用代码中执行的操作是否有意义?

4 个答案:

答案 0 :(得分:2)

我的观点是你应该只测试公共方法。无论来自public方法的调用,都将测试私有方法的用法。它还可以在不改变测试的情况下更轻松地进行内部重构。

你要测试的是班级履行合同,即。公共方法,无论它在内部如何看。

答案 1 :(得分:1)

如果公共方法的测试涵盖了私有方法中的所有代码,则可以安全地考虑测试类

答案 2 :(得分:1)

如果私有方法的逻辑(readHeaderRowreadOtherRowsBasedOnHeader,...)很复杂且需要单独测试,我建议将FileReader实现为较小类的composition 。它会是这样的:

class FileReader {

private FileHeaderReader headerReader = new FileHeaderReader();
private FileOtherReader otherReader = new FileOtherReader();
//....
private FileInputStream input;

public FileReader(FileInputStream input) {
    this.input = input;
}

public void read() throws IOException {
    Row row = headerReader.read();
    Row[] rows = otherReader.read(row);
    //do something else
}  
}

class FileHeaderReader {
    public Row read() {...}
}
//....

然后你可以编写测试来精确测试每个部分/类的逻辑。您还可以将injecting FileHeaderReader考虑到FileReader中,这样这些类就不会紧密耦合。

答案 3 :(得分:1)

我看到两个可行的选择。

  1. 您测试 read(),因此您的测试应涵盖私有方法中更改的条件和状态。无论你是否想要这样做,这都取决于这些方法的责任和复杂性。
  2. 您发现这些私有方法违反 SRP 并将它们分开,以便它们现在在另一个类中公开。