Java 在此场景中编写可测试代码

Java 在此场景中编写可测试代码,java,Java,我试图确定编写可测试代码的最佳方式。这是我的密码 class FileReader { private FileInputStream input; public FileReader(FileInputStream input) { this.input = input; } public void read() throws IOException { Row row = readHeaderRow();

我试图确定编写可测试代码的最佳方式。这是我的密码

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()在调用代码中所做的操作有意义吗

> P>如果公共方法的测试覆盖了私有方法中的所有代码,则可以安全地考虑类<强>测试< /强>

< P>如果公共方法的测试覆盖了私有方法中的所有代码,则如果私有方法的逻辑,则可以安全地考虑类<强>测试

< P>(
readHeaderRow
readOtherRowsBasedOnHeader
,…)非常复杂,需要单独的测试,我建议将
FileReader
作为一个较小的类来实现。它类似于:

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() {...}
}
//....

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

如果私有方法的逻辑(
readHeaderRow
readOtherRowsBasedOnHeader
,…)非常复杂,需要单独的测试,我建议将
FileReader
作为一个较小的类来实现。它类似于:

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() {...}
}
//....

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

我的观点是,您应该只测试公共方法。无论来自公共方法的调用如何,都将测试私有方法的使用情况d、 它还可以在不改变测试的情况下使内部重构变得更加容易


您要测试的是类是否履行了它的契约,即公共方法,无论它在内部看起来如何。

我的观点是,您应该只测试公共方法。私有方法的使用将通过公共方法的调用进行测试。它还将使内部重构更加容易,而不改变e试验


您要测试的是类是否履行了它的契约,即公共方法,无论它在内部看起来如何。

我看到了两个可行的选择

  • 您测试的是read(),因此您的测试应该涵盖私有方法中更改的条件和状态。这实际上取决于这些方法的责任和复杂性,您是否希望这样做
  • 您发现这些私有方法违反了SRP,并将它们分开,以便它们现在在另一个类中是公共的

  • 我看到两个可行的选择

  • 您测试的是read(),因此您的测试应该涵盖私有方法中更改的条件和状态。这实际上取决于这些方法的责任和复杂性,您是否希望这样做
  • 您发现这些私有方法违反了SRP,并将它们分开,以便它们现在在另一个类中是公共的

  • 您不应该为了编写可测试代码而将方法公开或私有。您可以始终使用反射来测试类的私有方法。Junit/TestNG之类的测试框架是否支持这种基于反射的开箱即用测试?这里有一个链接,其中有一篇关于使用Junit和反射测试私有方法的文章-您应该不要为了编写可测试代码而将方法公开或私有。您可以始终使用反射来测试类的私有方法。像Junit/TestNG这样的测试框架是否支持这种基于反射的开箱即用测试?这里有一个链接,其中有一篇关于使用Junit和反射测试私有方法的文章-我考虑过这一点,但我想如果我继续这样做,我会导致类爆炸。这不是一个通用的解决方案。只是众多解决方案中的一种。始终要用你的头脑来决定哪种方法是最好的。不管怎样,不要害怕有许多类,记住对象组合通常会导致更多的可测试代码。我考虑过这一点,但我认为如果我继续这样做,我会导致类爆炸。这不是一个通用的解决方案。只是众多解决方案中的一种。始终要用你的头脑来决定哪种方法是最好的。不管怎样,不要害怕有许多类,记住对象组合通常会导致更多的可测试代码。好的,非常有效的答案。好的,非常有效的答案回答。