使用大型方法测试

时间:2017-05-15 14:16:16

标签: java testing

我正在开展一些项目,现在我正在努力进行测试。我有以下课程:

public interface Connector{ }

public class ConnectorFactory{


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

测试这门课是绝对必要的。但是这种方法太大而不易测试。我找到的解决方案是拆分为 默认访问 方法,如下所示:

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

每种默认访问方法都很容易测试。他们是默认访问的唯一原因是测试。

这样做是否常见?

2 个答案:

答案 0 :(得分:1)

所以问题似乎是:我们拥有所有这些共同创造某些东西的方法,它们不应该是私有的吗?是否有足够的理由将它们暴露给世界?

嗯,不是世界,默认情况下它们是包私有的,但仍然......

但是让我们回答一下这个问题:为什么这些方法首先在同一个类中?显而易见的答案是:嗯,这就是以前的事情,但这不是一个好的。在编写可测试代码时,我们会努力为Loose CouplingHigh Cohesion而努力。您的原始代码是紧密耦合的,而不是非常有凝聚力。它足够复杂,它有自己的init(),然后模板可能是硬编码的,并且在其内部某处可以自行打开输入流。

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

答案 1 :(得分:1)

特定于一个类的方法应该是私有的,以确保抽象。您不应仅仅为了测试而更改其访问修饰符。有一些方法可以测试私有方法,您可以查看以前的堆栈溢出帖子:

How do I test a class that has private methods, fields or inner classes?

这些是我在测试时记住的一些其他事项:

  • 确保您有依赖注入
  • 使您的程序尽可能模块化,易于阅读,易于重复使用以及易于测试,总是很好的。所以,我认为将方法分解为较小的方法是件好事。