假设我有以下接口和实现:
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
的具体实施,我将部分请求处理委托给HttpHandler
和SQLHandler
。在单元测试时,我应该模拟HttpHandler
和SQLHandler
并实际测试我的请求是否被委托给这些对象?或者我只需要从基于合同的角度测试我的实现,即测试我的handle(Request request)
方法是否返回有意义的响应?
答案 0 :(得分:2)
是的,您应该模拟单元测试的HttpHandler
和SQLHandler
对象。单元测试应验证RequestHandlerImpl
中的代码是否符合您的预期,包括正确使用注入的依赖项。
答案 1 :(得分:2)
是的,你应该。
RequestHandlerImpl
的单元测试可能会失败,尽管类本身的工作完全正常。它只是被HttpHandler
或SQLHandler
的实现中的错误所背叛,只有在运行这些类的测试时才会出现。
答案 2 :(得分:1)
单元测试的目的是验证RequestHandlerImpl.handle方法是否正确地进行了路由。
如果单元测试RequestHandlerImpl,你应该模拟SqlHandler和HttpHandler并测试该请求是否正确委托给那些模拟。
为什么那些人应该被嘲笑?为什么不注入真正的HttpHandler和SqlHandler对象?
因为您的单元测试假设只测试RequestHandlerImpl。如果由于HttpHandlers问题导致RequestHandlerImpl单元测试失败,则表示错误。
首先想想你要测试的单位是什么。确定您的功能的其他依赖单位。然后模拟所有其他单位的工作。