Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试应该测试依赖交互吗?_Java_Unit Testing - Fatal编程技术网

Java 单元测试应该测试依赖交互吗?

Java 单元测试应该测试依赖交互吗?,java,unit-testing,Java,Unit Testing,假设我有以下接口和实现: RequestHandler.java public interface RequestHandler { public Response handle(Request request); } public class RequestHandlerImpl implements RequestHandler { private HttpHandler httpHandler; private SQLHandler sqlHandler;

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

RequestHandler.java

public interface RequestHandler {

    public Response handle(Request request);

}
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
    }

}
RequestHandlerImpl.java

public interface RequestHandler {

    public Response handle(Request request);

}
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
的这个特定实现,我将把一些请求处理委托给
HttpHandler
SQLHandler
。当进行单元测试时,我是否应该模拟
HttpHandler
SQLHandler
并实际测试我的请求是否被委托给这些对象?或者我只需要从基于契约的角度测试我的实现,即测试我的
handle(Request-Request)
方法是否返回有意义的响应?

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

是的,您应该这样做


您对
RequestHandlerImpl
的单元测试可能会失败,尽管类本身工作得非常好。它刚刚被
HttpHandler
SQLHandler
的实现中的一个错误暴露出来,只有在运行这些类的测试时才会出现该错误。

单元测试的目的是验证您的RequestHandlerImpl.handle方法是否正确执行路由

如果您对RequestHandlerImpl进行单元测试,那么您肯定应该模拟SqlHandler和HttpHandler,并测试该请求是否被正确地委托给这些模拟

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

因为单元测试假设只测试RequestHandlerImpl。如果您的RequestHandlerImpl单元测试由于HttpHandlers问题而失败,这将是一个错误的指示


所以首先想想你要测试的单元是什么。确定功能的其他相关单元。然后模拟所有其他单元工作。

Ref.:“集成测试是软件测试中的一个阶段,在该阶段中,单个软件模块作为一个组进行组合和测试。它发生在单元测试之后和验证测试之前。”@user2864740,但这不是集成测试,我模拟出dependencies单元测试最好一次隔离到一个类,在本例中是
requesthandlerimp
。您应该注入
httpHandler
sqlHandler
的模拟实例,以便
requesthandlerimp
通过其关联的单元测试完全执行