java - 拆分大的测试方法

标签 java testing

我正在做一些项目,现在我正在努力进行测试。我有以下类(class):

public interface Connector{ }

public class ConnectorFactory{


     public Connector create(){
         //Very complicated logic
     }
}

测试这个类是绝对必要的。但是这个方法太大了,不容易测试。我找到的解决方案是分成 default-access 方法,如下所示:

public class ConnectorFactory{


     public Connector create(){
         initState();
         checkIncomingParameters();
         applyTemplates();
         prepareResult();
         InputStream is = openInputStream();
         return createFromInputStream(is);
     }

     void initState(){ 
         //... 
     }

     void checkIncomingParameters(){ 
         //... 
     }

     String applyTemplates(){
         //...
     }

     void prepareResult(){
         //...
     }

     InputStream openInputStream(){
         //...
     }

     Connector createFromInputStream(InputStream is){
         //...
     }
}

这些默认访问方法中的每一个都很容易测试。它们是默认访问的唯一原因是测试。

这样做很常见吗?

最佳答案

所以问题似乎是:我们拥有所有这些一起创建某些东西的方法,它们不应该是私有(private)的吗?测试是否足以将它们暴露给世界?

好吧,不是世界,默认情况下它们是包私有(private)的,但仍然......

但是让我们反过来问:为什么这些方法首先在同一个类中?显而易见的答案是:好吧,以前就是这样,但这不是一件好事。在编写可测试代码时,我们力求,除其他外,Loose CouplingHigh Cohesion .您的原始代码是紧密耦合的,并且不是很有凝聚力。它足够复杂,它有自己的 init(),然后模板可能是硬编码的,并且在它内部深处的某个地方自己打开一个输入流。

要改进该设计,您应该模块化逻辑。某处有一个输入流解析器,某处有一个模板引擎,某处有一个结果被放在一起并返回。您应该使用适当的 API 使每一个都成为自己的类,然后您会发现您的担忧消失了。

关于java - 拆分大的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981797/

相关文章:

c++ - 如何测试对私有(private)函数的访问?

java - 适合 JTable 以填充 JPanel

java - 无法从站点下载 JD-Eclipse?还有其他下载源吗?

testing - 如何在 ubuntu 16.04 中更新 Jmeter 最新版本?

c# - 为什么这个异步单元测试会永远阻塞线程?

objective-c - 电池百分比 - 在任何 iPhone 上进行准确测试

java - Wicket Wizard 在 isComplete() 方法中给出错误信息;

java - 带有列标题的 StatefulBeanToCsv

java - 如何将标签添加到选项卡式 Pane 上的额外空间

java - 如何构建应用程序以帮助测试 sql