单元测试的目的是在不涉及依赖的情况下测试代码(隔离)。一个设计良好的系统需要遵循 SOLID 原则。
(S) Single responsibility principle 单一职责
(O) Open/closed principle 开闭原则,对修改关闭,对扩展开放
(L) Liskov substitution principle 里氏替换原则,子类和父类表现一致
(I) Interface segregation principle 接口隔离原则,不要依赖不要使用的方法,或者在设计时尽量将大接口拆开
(D) Dependency inversion 依赖反转,将类和其他类隔离开,尽量依赖抽象,而不依赖具体实现,比如当修改了外部外部依赖具体实现,而不需要大规模的修改原始代码
Target and challenge of unit testing
Unit test 目标是针对一个模块或者一段代码隔离测试,应该消除其他类,或者系统依赖带来的副作用。
测试替身(Test Doubles)用来消除这类副作用,test Doubles 可以分为:
dummy object 传入不使用
fake object 有基本实现,但是非常简单,比如内存数据库
stub class 带着特殊目的的接口或者类的部分实现
mock object 接口或者类的虚假实现,可以用来定义固定的输出,mock object 在测试中用来执行特定的行为
通常情况下可以通过手工代码来 mock objects 或者使用 mock framework 来模拟类的行为。Mockito 是一个非常流行的 Mock framework,使用 Mo