问题:正在测试的对象创建了合作者对象。必须用模仿对象替换这个合作者。
  重构之前的代码: class Application {
  ...
  public void run() {
  View v = new View();
  v.display();
  ...
  解决方案:将创建代码抽取到工厂方法,在测试子类中覆盖该工厂方法,然后使被覆盖的方法返回模仿对象。后,如果可以的话,添加需要原始对象的工厂方法的单元测试,以返回正确类型的对象:
  重构之后的代码:
  class Application {
  ...
  public void run() {
  View v = createView();
  v.display();
  ...
  protected View createView() {
  return new View();
  }
  ...
  }
  该重构启用清单 1 中所示的单元测试代码:
  清单 1. 单元测试代码:
  class ApplicationTest extends TestCase {
  MockView mockView = new MockView();
  public void testApplication {
  Application a = new Application() {
  protected View createView() {
  return mockView;
  }
  };
  a.run();
  mockView.validate();
  }
  private class MockView extends View
  {
  boolean isDisplayed = false;
  public void display() {
  isDisplayed = true;
  }
  public void validate() {
  assertTrue(isDisplayed);
  }
  }
  }
  角色
  该设计引入了由系统中的对象扮演的下列角色:
  目标对象:正在测试的对象 合作者对象:由目标对象创建或获取的对象 模仿对象:遵循模仿对象模式的合作者的子类(或实现) 特殊化对象:覆盖创建方法以返回模仿对象而不是合作者的目标的子类