...
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);
}
}
}
角色
該設計引入了由系統中的對象扮演的下列角色:
目標對象:正在測試的對象 合作者對象:由目標對象創建或獲取的對象 模仿對象:遵循模仿對象模式的合作者的子類(或實現) 特殊化對象:覆蓋創建方法以返回模仿對象而不是合作者的目標的子類文章來源于領測軟件測試網 http://www.kjueaiud.com/