2014-03-13 88 views
2

比方說,我有以下的接口和實現:單元測試測試依賴性交互?

RequestHandler.java

public interface RequestHandler { 

    public Response handle(Request request); 

} 

RequestHandlerImpl.java

public class RequestHandlerImpl implements RequestHandler { 

    private HttpHandler httpHandler; 
    private SQLHandler sqlHandler; 

    public RequestHandlerImpl(HttpHandler httpHandler, SQLHandler sqlHandler) { 
     this.httpHandler = httpHandler; 
     this.sqlHandler = sqlHandler; 
    } 

    @Override 
    public Response handle(Request request) { 
     // Disassemble request and dispatch to HttpHandler and SQLHandler 
     // Return response based off interaction with handlers 
    } 

} 

對於這種具體實施的RequestHandler我委託一些請求處理爲HttpHandlerSQLHandler。當單元測試時,我應該剔除HttpHandlerSQLHandler並且實際測試我的請求是否被委派給這些對象?或者,我只需要從基於合同的角度測試我的實施,即測試我的handle(Request request)方法是否會返回有意義的響應?

+0

Ref。 [集成測試](http://en.wikipedia.org/wiki/Integration_testing):「集成測試是軟件測試階段,其中各個軟件模塊被組合並作爲一個組進行測試,它發生在單元測試之後和驗證之前測試「。 – user2864740

+0

@ user2864740除了這不是集成測試之外,我正在嘲笑依賴關係 –

+0

單元測試最好每次只隔離一個類,在本例中爲'RequestHandlerImpl'。您應該注入'httpHandler'和'sqlHandler'的模擬實例,以便通過其相關的單元測試完全執行'RequestHandlerImpl' –

回答

2

是的,你應該。

這可能是可能的RequestHandlerImpl單元測試失敗,雖然類本身工作完全正常。它只是在執行HttpHandlerSQLHandler時出現的一個bug而出現的,它應該只在運行這些類的測試時出現。

2

是的,你應該模擬出你的單元測試的HttpHandlerSQLHandler對象。單元測試應驗證RequestHandlerImpl中的代碼是否符合您的期望,其中包括正確使用注入的依賴關係。

+0

非常感謝 –

1

目的單元測試是驗證RequestHandlerImpl.handle方法是否正確呢路由。

如果單元測試RequestHandlerImpl肯定,你應該嘲笑SqlHandler和HttpHandler的和測試請求被委託給正確的嘲笑。

爲什麼這些應該被嘲笑?爲什麼不注入真正的HttpHandler和SqlHandler對象?

因爲你的單元測試假設測試只有RequestHandlerImpl。如果您的RequestHandlerImpl單元測試由於HttpHandlers問題而失敗,那將是一個錯誤的指示。

所以首先想想你要測試的單位是什麼。確定您的功能的其他依賴單位。然後嘲笑所有其他單位的工作。