本文是在读了《Working Effectively with legacy Code 》第九章,关于在无法将类放入测试用具中时遇到的四种为常见的问题:

  (1)无法轻易创建该类的对象。

  (2)当该类位于测试用具中时,测试用具无法轻易通过编译构建。

  (3)我们需要用到的构造函数具有副作用。

  (4)构造函数中有一些要紧的工作,我们需要感知到它们。

  这四个问题在进行单元测试或者接口测试的时候,会对测试工作造成很大的阻碍,这是一个代码可测性的问题。当遇到这样的问题的时候,有两种方法,第一、强行构建一个类去完成测试,但是这会造成测试的时候大部分工作都耗费在构建这样一个类的过程中;第二、重构代码,使代码具有可测性。本文将通过书中的列子来简单介绍一下如何提高代码的可测性。

  如在一个计费系统中,我们有一个未测试的Java类:CreditValidator。

public class CreditValidator
       {
             public CreditValidator (RGHConnection connection,
                                             CreditMaster master,
                                             String validatorID) {
       }
     Certificate validateCustomer(Customer customer) throws InvalidaCredit{
      }
     public class RGHConnection
        {
              public RGHConnection(int port, String Name, String passwd) throws IOException {
             }
         }
    }

  我们可以看到CreditValidator构造函数含有三个参数RGHConnection,CreditMaster,validatorID。其中RGHConnection对象在构造时会连接到一个服务器,这个链接被用来从服务器上获取必要的信息,以检查客户的余额。

  宁一个类CreditMaster,则提供一些我们在检查余额的过程中会用到的策略信息。该类的构造函数会从一个文件中加载相关信息,并把这些信息保存在内存中以备后用。

  如果按照我们开头讲的强制构造一个类来完成测试,如下所示:

public void testCreate() throws Exception {
       RGHConnection connection = new RGHConnection(DEFAULT_PORT,"admin","rii8ii9s");
       CreditMaster master = new CreditMaster ("crm2.mas",true);
       CreditValidator validator = new CreditValidator(connection,master,"a");
}