Java 单元测试应该测试依赖交互吗?
假设我有以下接口和实现: RequestHandler.javaJava 单元测试应该测试依赖交互吗?,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;
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
通过其关联的单元测试完全执行