我正在尝试为具有使用request的方法创建一个单元测试。httpcomponents-client-ga/fluent-hc/apidocs/org/apache/http/client/fluent/request.html)。
问题是,我不希望每次运行测试套装时发送实际请求,甚至更少,如果它的单位测试,而不是集成。但是我不知道如何解决这个问题。
我是测试世界中的新手,而且我在大多数时候都无法测试某些东西时阅读的内容,班级的设计存在问题。
public class HttpRequestSenderServiceImpl implements RequestSenderService {
@Override
public Response sendRequest(String address, String messageBody) throws IOException {
Request request = Request.Post(address).bodyString(messageBody, ContentType.APPLICATION_JSON);
Response response = request.execute();
return response;
}
}
我正在使用春季框架和春季测试,摩根托和测试ng作为测试工具。如果您至少可以将我指向正确的方向,任何阅读,预订,视频等内容的材料,我将非常感谢。我只想学习正确的方式。
我已经找到了一些"解决方案"来解决我的问题,但它们都使用了PowerMockito,而我所读的内容对您不利,因为允许嘲笑静态方法,构造函数等,这些方法转化为不良的编码实践,我要在这里避免的东西。
出于您的目的,问题在Apache的Fluent-HC Request.Post
中比您的代码更为静态而不是模拟友好。
您可以使用执行程序并模拟执行方法,或者如果要使用Request.Post
将其包装在另一个低级服务接口中并使用它:
interface RequestSender {
Response send(String addr,msgBody)
}
class RequestSenderImpl implements RequestSender {
public Response send(String addr,msgBody) {
Request request = Request.Post(address).bodyString(messageBody,ContentType.APPLICATION_JSON);
Response response = request.execute();
return response;
}
}
这样,即使没有Mockito,您也可以轻松模拟代码。
@lujop为提到的问题提供了建议,我认为这是一种方法。
但是,关于使用模拟框架的较早陈述,我一直都不是一个不好的做法。考虑@lujop的建议,您可能最终会使用测试双重测试请求及其业务逻辑。
。但是,会有一个类-FluentHCRequestSender
-将负责实际拨打Request.Post
。现在,如果您为所有课程编写UTS,则必须使用模拟框架来测试FluentHCRequestSender
,以确保此类使用正确的API。
有一个使用模拟框架进行测试的地方。但是通常,如果您最终使用模拟框架是您,您的团队或组织创建的类,则可以指出一个不良设计。
。并回答您的资源问题,这些问题可以帮助您编写更好的UT和代码,
扎实的原则 - 这可能是总是在后面的一件事 我在编写代码时的想法。
有效地使用遗产代码为我服务。
测试驱动的开发 - 在我的练习中,很难很容易 严格遵循您的日常日常工作,但至少迫使我 不要将我的UT抛弃,并与我的实际 类(如果不是以前)。
设计模式 - 抓住一个好的设计图案书/视频 如果您可以访问图书馆或购买一个图书馆。这些概念似乎 令人生畏,但我发现其中一些在我的日常工作中确实很有用 工作,尤其是在编写UTS时。
但是,就个人而言,学习在代码库中查看现有代码并查看什么是好的和可以改进的最佳方法。我发现看的和理解的代码是由做好设计的人所写的,比任何书籍都更有用。
希望这个长期蜿蜒的帖子会有所帮助!
ps-试图做正确的方式的荣誉。有时,尽管应该是,但不经常说。