我正在尝试确定编写可测试代码的最佳方法。这是我的代码
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()在调用代码中执行的操作是否有意义?
答案 0 :(得分:2)
我的观点是你应该只测试公共方法。无论来自public方法的调用,都将测试私有方法的用法。它还可以在不改变测试的情况下更轻松地进行内部重构。
你要测试的是班级履行合同,即。公共方法,无论它在内部如何看。
答案 1 :(得分:1)
如果公共方法的测试涵盖了私有方法中的所有代码,则可以安全地考虑测试类
答案 2 :(得分:1)
如果私有方法的逻辑(readHeaderRow
,readOtherRowsBasedOnHeader
,...)很复杂且需要单独测试,我建议将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)
我看到两个可行的选择。