应该单元测试测试依赖互动?

时间:2014-03-13 08:37:36

标签: java unit-testing

假设我有以下接口和实现:

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)方法是否返回有意义的响应?

3 个答案:

答案 0 :(得分:2)

是的,您应该模拟单元测试的HttpHandlerSQLHandler对象。单元测试应验证RequestHandlerImpl中的代码是否符合您的预期,包括正确使用注入的依赖项。

答案 1 :(得分:2)

是的,你应该。

RequestHandlerImpl的单元测试可能会失败,尽管类本身的工作完全正常。它只是被HttpHandlerSQLHandler的实现中的错误所背叛,只有在运行这些类的测试时才会出现。

答案 2 :(得分:1)

单元测试的目的是验证RequestHandlerImpl.handle方法是否正确地进行了路由。

如果单元测试RequestHandlerImpl,你应该模拟SqlHandler和HttpHandler并测试该请求是否正确委托给那些模拟。

为什么那些人应该被嘲笑?为什么不注入真正的HttpHandler和SqlHandler对象?

因为您的单元测试假设只测试RequestHandlerImpl。如果由于HttpHandlers问题导致RequestHandlerImpl单元测试失败,则表示错误。

首先想想你要测试的单位是什么。确定您的功能的其他依赖单位。然后模拟所有其他单位的工作。

相关问题