【问题标题】:writing testable code in this scenario [duplicate]在这种情况下编写可测试的代码[重复]
【发布时间】:2015-12-15 20:03:35
【问题描述】:

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

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() 在调用代码中所做的事情是否有意义?

【问题讨论】:

  • 您不应该为了编写可测试的代码而将方法设为公开或私有。你总是可以使用反射来测试你的类的私有方法。
  • Junit/TestNG 等测试框架是否支持开箱即用的这种基于反射的测试?
  • 这是一个链接,其中有一篇关于使用 Junit 和反射测试私有方法的文章 - jroller.com/CoBraLorD/entry/junit_testing_private_fields_and

标签: java


【解决方案1】:

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

您要测试的是该类是否履行其合同,即。公共方法,无论其内部看起来如何。

【讨论】:

    【解决方案2】:

    如果私有方法(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】:

    如果公共方法的测试覆盖了私有方法中的所有代码,那么考虑类tested

    是安全的

    【讨论】:

    • 好的,非常有效的答案。
    【解决方案4】:

    我看到了两个可行的选择。

    1. 您测试了 read(),因此您的测试应涵盖私有方法中更改的条件和状态。您是否愿意这样做实际上取决于这些方法的责任和复杂性。
    2. 您发现那些私有方法违反 SRP 并将它们分开,以便它们现在在不同的类中公开。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      相关资源
      最近更新 更多