1.6 单元测试

测试开发中的手机软件,往往先采用模拟器。搭建分布式系统往往比较麻烦,需要能够让其他的代码逻辑在没有真正的分布式系统的情况下也可以测试,也就是可以方便地进行单元测试。

通过依赖注入(Dependency Injection)解决单元测试问题。例如,有个类需要访问数据库:

        public class Example {
          private DatabaseThingie myDatabase; //依赖项


          public Example() {
            myDatabase = new DatabaseThingie();
          }


          public void doStuff() {
            ...
            myDatabase.getData();
            ...
          }
        }

有的数据库安装起来比较麻烦,因为无法初始化Example类的实例,导致后续的测试无法进行。这时,可以使用从外部注入的实例。

        public class Example {
          private DatabaseThingie myDatabase;


          public Example() {
            myDatabase = new DatabaseThingie();
          }


          public Example(DatabaseThingie useThisDatabaseInstead) {
            myDatabase = useThisDatabaseInstead;
          }


          public void doStuff() {
            ...
            myDatabase.getData();
            ...
          }
        }

测试类中可以方便地注入数据库存根类。

        public class ExampleTest {
          TestDoStuff() {
            MockDatabase mockDatabase = new MockDatabase();


            // MockDatabase是DatabaseThingie的子类,因此可以在这里注入它
            Example example = new Example(mockDatabase);


            example.doStuff();
            mockDatabase.AssertGetDataWasCalled();
          }
        }