...
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);
}
}
}
角色
该设计引入了由系统中的对象扮演的下列角色:
目标对象:正在测试的对象 合作者对象:由目标对象创建或获取的对象 模仿对象:遵循模仿对象模式的合作者的子类(或实现) 特殊化对象:覆盖创建方法以返回模仿对象而不是合作者的目标的子类文章来源于领测软件测试网 https://www.ltesting.net/