使用LocalTestServer对HTTP调用进行单元测试

有时候,当您正在对远程服务器进行HTTP调用的单元测试代码时。 您可能正在使用诸如Apache'sHttpClient或Spring的RestTemplate之类的库。

当然,您不想依靠远程服务进行单元测试。 除了涉及的开销(记住单元测试应该是快速的)之外,您根本不能依赖于在执行测试期间可以使用的远程服务。 您可能还无法完全控制所有测试方案的响应。

考虑下面的简化示例。

ExampleHttpCall

public class ExampleHttpCall {private String serviceUrl;public ExampleHttpCall(String url) {serviceUrl = url;}public String doGet() {RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> responseEntity = restTemplate.getForEntity(serviceUrl, String.class);String response = responseEntity.getBody();return response;}}

您将如何为ExampleHttpCall编写单元测试?

当然,您可以以这样的方式重新设计类,以使RestTemplate的实例被注入到类中:

ExampleHttpCall备用版本

@Component
public class ExampleHttpCallAlternateVersion {@Resourceprivate RestTemplate restTemplate;private String serviceUrl;public ExampleHttpCallAlternateVersion(String url) {serviceUrl = url;}public String doGet() {ResponseEntity<String> responseEntity = restTemplate.getForEntity(serviceUrl, String.class);String response = responseEntity.getBody();return response;}}

现在可以嘲笑该依赖关系,从而使您可以更好地控制。 然而,由于附加的配置,该方法还导致增加的复杂性。 此外,您可能会遇到很多乏味的嘲笑。

对于这个简单的示例,使用模拟可能是解决方法。 但这并非总是如此。 如果是这样,另一种可能的方法是使用本地测试服务器。 碰巧的是,Apache HttpClient项目在其测试工件中提供了LocalTestServer。 如果您使用的是Maven,则可以通过添加以下依赖项将其包括在内:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.6</version><classifier>tests</classifier><scope>test</scope>
</dependency>

现在,您可以在单元测试中设置服务器:

LocalTestServer设置

private LocalTestServer server = new LocalTestServer(null, null);@Before
public void setUp() throws Exception {server.start();
}@After
public void tearDown() throws Exception {server.stop();
}

当然,仅启动和停止服务器并不能帮助您。 因此,您还需要另一种成分。 您将要注册一个或多个实现org.apache.http.protocol.HttpRequestHandler接口的处理程序,例如:

注册您的处理程序

server.register("/foo/*", myHttpRequestHandler);

HttpRequestHanlder接口将让您实现方法void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException;

该方法将使您完全控制HTTP响应。

因此,对于我们的原始示例,最小的单元测试可能类似于以下代码:

基本单元测试

public class ExampleHttpCallTest {private ExampleHttpCall exampleHttpCall;private LocalTestServer server = new LocalTestServer(null, null);private HttpRequestHandler myHttpRequestHandler = new HttpRequestHandler() {@Overridepublic void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {response.setEntity(new StringEntity("foobar"));}};@Beforepublic void setUp() throws Exception {server.start();server.register("/foo/*", myHttpRequestHandler);String serverUrl = "http:/" + server.getServiceAddress();exampleHttpCall = new ExampleHttpCall(serverUrl +"/foo/bar");}@Afterpublic void tearDown() throws Exception {server.stop();}@Testpublic void test() {String result = exampleHttpCall.doGet();assertEquals("foobar", result);}}

这就是开始所需要的全部。 从这里开始,您可以通过为每种可能的情况添加测试用例来进行详细说明。

翻译自: https://www.javacodegeeks.com/2015/08/unit-testing-http-calls-with-localtestserver.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP header函数大全

PHP header函数大全 header(Content-Type: text/html; charsetutf-8); header(Location: http://www.php-note.com/); <?php // fix 404 pages: header(HTTP/1.1 200 OK);// set 404 header: header(HTTP/1.1 404 Not Found);// set Moved Permanently header (good for re…

JS提升(hoisting)

近期在学习js&#xff0c;了解到js的一个名词&#xff0c;就是hoisting&#xff0c;进而了解了下js的解析机制 详情可参考&#xff1a;http://www.runoob.com/js/js-hoisting.html js的解析过程分为两个阶段&#xff1a;编译阶段和执行阶段 编译阶段&#xff1a;即我们常说的…

【Java从入门到天黑|01】SE入门之Java的前生今世

大家好,我是孙叫兽,微信公众号【孙叫兽杂谈】,本期给大家分享一下JavaSE的入门部分之Java的前生今世。 Java : 一个帝国的诞生 C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。 1972年, 随着C语言的诞生和Unix的问世, 帝国

前端-html、css

HTML一、html简介超级文本标记语言是标准通用标记语言下的一个应用&#xff0c;也是一种规范&#xff0c;一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff0c;可以告诉浏览器如…

在Java EE组件中使用骆驼路线

从现在开始我一直在与Camel合作&#xff0c;我真的很喜欢它的简单性。 在Java EE之上始终使用它一直是一个挑战&#xff0c;而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上建议使用WildFly-Camel Subsystem 。 在正在进行的系列文章中&…

【Java从入门到天黑|02】SE入门之Java基础

大家好,我是孙叫兽,微信公众号【孙叫兽杂谈】,本期给大家分享一下JavaSE的入门部分之Java基础 目录 注释 标识符 数据类型 类型转换 变量,常量 运算符

webpack入门

遇到问题首先到github项目的Issues中&#xff0c;检索一下相关问题&#xff0c;比在百度谷歌上直接搜索非官方解决方案好得多。 1、npm init 生成 package.json 2、npm i -D webpack 生成 # npm i -D 是 npm install --save-dev 的简写&#xff0c;是指安装模块并保存到 packa…

接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架

基于pythonTestlinkJenkins实现的接口自动化测试框架 by:授客 QQ&#xff1a;1033553122 博客&#xff1a;http://blog.sina.com.cn/ishouke 欢迎加入软件性能测试交流QQ群&#xff1a;7156436 目录 1、 开发环境... 1 2、 主要功能逻辑介绍... 1 3、 框架…

PC钉钉无法输入汉字的解决办法

问题描述 新公司办公OA使用的钉钉&#xff0c;今天想给设计师发消息呢&#xff0c;发现私活输入不了汉字&#xff0c;早上还行呢&#xff0c; 过程尝试 在百度中可以输入汉字&#xff0c;在钉钉中不行。 解决办法 退出钉钉&#xff0c;重新进入&#xff0c;可以输入汉字了。如果…

this的指向

箭头函数&#xff1a;定义时所在的作用域&#xff08;tip:继承而来 函数作用域 &#xff09; 普通函数&#xff1a;指向调用它的对象 箭头函数体内的 this对象&#xff0c;就是定义时所在的对象&#xff0c;而不是使用时所在的对象 1、箭头函数没有自己的this&#xff0c;ar…

事关每个程序员的职业规划与履历

今天&#xff0c;甚至过去&#xff0c;大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程&#xff0c;还是已经奋斗多年&#xff0c;以下内容都会对您的职业生涯有所助益。 目录 几条重要的职业规划提示。 1. 学习的步伐不停止 2. 学会问、学会听&#xff0c;学会学习…

iOS--viewController

隐藏状态栏 1 -(BOOL)prefersStatusBarHidden{ 2 return YES; 3 } 转载于:https://www.cnblogs.com/chebaodaren/p/5367160.html

jsf 开发_JSF开发人员应该知道的5种有用方法

jsf 开发这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。 必须按faces-config.xml或注释注册该bean。 注入是好的&a…

程序员应该如何规划自己的人生与书写履历?

今天,甚至过去,大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程,还是已经奋斗多年,以下内容都会对您的职业生涯有所助益。几条重要的职业规划提示。1. 学习的步伐不停止 古人说,活到老,学到老。终身学习应该是您的座右铭。 世界在不断变化,每个人都在寻找各…

浅谈多线程——NSThread

上一篇文章中我们大致了解了GCD的模式和方法&#xff0c;在iOS开发中除了GCD之外&#xff0c;还有NSThread和NSOperation两种多线程方式。 1.NSThread - a - 使用NSThread开辟多线程进行子任务处理&#xff1a;类方法和初始化方法 使用类方法不需要创建对象就可以直接开辟多线程…

小程序思考与回答

1.全局scss $:考虑引入 4.import url 引入css 的区别 5.uniapp 中不需要scope 页面样式也不会相互影响&#xff1f; 6.文件上传 oss? 二、引入qs这个库&#xff0c;更好的处理网络请求传参。 三、图片文件转为base64 好处&#xff1a; 1、减少了下载图片的http请求数&#x…

2021年程序员可以做哪些副业?

哈喽&#xff0c;大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享程序员搞副业的一期节目&#xff0c;欢迎大家一起学习。 1.程序员为什么要做副业&#xff1f; 副业意味着自由 时至今日&#xff0c;仍然有一大群程序员还天真地认为从事副业是一种压迫。但事实是&…

学习Apache Camel –实时索引推文

在大多数软件开发项目中&#xff0c;有一点需要使应用程序开始与其他应用程序或第三方组件通信。 无论是发送电子邮件通知&#xff0c;调用外部api&#xff0c;写入文件还是将数据从一个地方迁移到另一个地方&#xff0c;您都可以推出自己的解决方案或利用现有框架。 对于Jav…

【坑】执行Consumer的时候发生java.net.UnknownHostException错误

【时间】&#xff1a; 2016/4/8 17:30 【问题】&#xff1a; kafka执行Consumer实例的时候&#xff0c;发生了一下错误。 kafka配置文件server.properties如下&#xff1a; zookeeper配置文件zoo.cfg内容如下&#xff1a; consumer的实现代码如下&#xff1a; 其中静态类的定义…

如何上架自己的应用到各大应用商店?

大家好&#xff0c;我叫孙叫兽&#xff0c;本期给大家分享的内容是如何上架自己的应用到应用商店&#xff0c;感谢大家的阅读&#xff01;1.上架各大应用商店需要准备哪些材料&#xff1f;上架各大安卓应用商店&#xff08;腾讯应用宝、阿里应用商店、百度手机助手、华为应用市…