1.概述

本文将重点介绍测试具有多种媒体类型/表示形式的RESTful服务。 这是关于使用Spring和基于Java的配置的Spring Security设置安全的RESTful Web Service的系列文章的第十篇。

REST with Spring系列:

  • 第1部分 – 使用Spring 3.1和基于Java的配置引导Web应用程序
  • P艺术2 - 构建RESTful Web服务使用Spring 3.1和Java配置
  • P艺术3 - 保护RESTful Web服务使用Spring Security 3.1
  • 第4部分 – RESTful Web服务可发现性
  • 第5部分 – 使用Spring进行REST服务发现
  • 第6部分 – 使用Spring Security 3.1的RESTful服务的基本身份验证和摘要身份验证
  • 第7部分 – Spring的REST分页
  • 第8部分 – 使用Spring Security对RESTful服务进行身份验证
  • 第9部分 – 带有Spring的REST的ETag

2.目标

任何RESTful服务都需要使用某种媒体类型将其资源作为表示形式公开,并且在许多情况下,还需要多个媒体类型。 客户端将设置Accept标头以选择其从服务中请求的表示形式。 由于资源可以具有多种表示形式,因此服务器将必须实现负责选择正确表示形式的机制-也称为内容协商。 因此,如果客户端请求application / xml ,则它应该获得Resource的XML表示,如果客户端请求application / json ,则应该获得JSON。

本文将说明如何编写集成测试,该测试能够在RESTful Service支持的多种表示形式之间切换。 目标是能够使用完全相同的服务URI运行完全相同的测试,而只是要求使用不同的媒体类型。

3.测试基础架构

我们将从为编组人员定义一个简单的接口开始–这将是允许测试在不同媒体类型之间切换的主要抽象:

public interface IMarshaller {...String getMime();
}

然后,我们需要一种基于某种形式的外部配置来初始化正确的编组器的方法。 对于这种机制,我们将使用Spring FactoryBean来初始化编组器,并使用一个简单的属性来确定要使用的编组器:

@Component
@Profile('test')
public class TestMarshallerFactory implements FactoryBean<IMarshaller> {@Autowiredprivate Environment env;public IMarshaller getObject() {String testMime = env.getProperty('test.mime');if (testMime != null) {switch (testMime) {case 'json':return new JacksonMarshaller();case 'xml':return new XStreamMarshaller();default:throw new IllegalStateException();}}return new JacksonMarshaller();}public Class<IMarshaller> getObjectType() {return IMarshaller.class;}public boolean isSingleton() {return true;}
}

让我们来看一下:

  • 首先,在这里使用Spring 3.1中引入的新的Environment抽象-有关更多信息,请查看带有Spring的属性文章
  • 从环境中检索test.mime属性 ,并用于确定要创建哪个封送处理程序-一些Java 7在这里使用String语法
  • 接下来,如果根本没有定义该属性,则默认的marshaller将成为支持JSON的Jackson marshaller
  • 最后–此BeanFactory仅在测试场景中处于活动状态,因为使用了Spring 3.1中引入的新@Profile支持

就是这样–该机制能够根据test.mime属性的值在编组器之间进行切换。

4. JSON和XML编组器

继续,我们将需要实际的marhsaller实施-每个受支持的媒体类型一个。

对于JSON,我们将使用Jackson作为基础库:

public class JacksonMarshaller implements IMarshaller {private ObjectMapper objectMapper;public JacksonMarshaller() {super();objectMapper = new ObjectMapper();}...@Overridepublic String getMime() {return MediaType.APPLICATION_JSON.toString();}
}

为了获得XML支持,编组人员使​​用XStream

public class XStreamMarshaller implements IMarshaller {private XStream xstream;public XStreamMarshaller() {super();xstream = new XStream();}...public String getMime() {return MediaType.APPLICATION_XML.toString();}
}

请注意,这些编组器未定义为它们自己的Spring组件。 原因是它们将由TestMarshallerFactory引导到Spring上下文中,因此不需要直接使它们成为组件。

5.同时使用JSON和XML来使用服务

在这一点上,我们应该能够对已部署的RESTful服务进行全面的集成测试。 使用编组器很简单–将IMarshaller直接注入到测试中即可:

@ActiveProfiles({ 'test' })
public abstract class SomeRestLiveTest {@Autowiredprivate IMarshaller marshaller;// tests...
}

当然,Spring将注入的确切编组将由test.mime属性的值确定 ; 这可以从属性文件中获取,也可以直接在测试环境中手动设置。 但是,如果没有为此属性提供值,则TestMarshallerFactory将仅使用默认的编组器JSON编组器。

6. Maven和詹金斯

如果将Maven设置为针对已部署的RESTful服务运行集成测试,则可以这样运行:

mvn test -Dtest.mime=xml

或者,如果此构建使用Maven生命周期的集成测试阶段:

mvn integration-test -Dtest.mime=xml

有关如何使用这些阶段,以及如何建立一个Maven构建,使其应用程序预集成测试目标的部署约束,在集成测试目标,然后关运行集成测试的详细信息在post-integration-test中查看已部署的服务,请参阅与Maven进行集成测试

使用Jenkins时 ,作业必须配置为:

This build is parameterized

并添加了String参数test.mime = xml

常见的Jenkins配置是必须针对已部署的服务运行运行同一组集成测试的作业-一个使用XML,另一个使用JSON表示。

7.结论

本文介绍了如何正确测试REST API。 大多数API的确会以多种表示形式发布其资源,因此测试所有这些表示形式至关重要,因此使用完全相同的测试非常酷。

要在实际集成测试中全面验证此机制,以验证所有资源的XML和JSON表示,请查看github项目 。

参考:来自baeldung博客的JCG合作伙伴 Eugen Paraschiv对具有多种MIME类型的REST进行了测试 。

翻译自: https://www.javacodegeeks.com/2013/01/testing-rest-with-multiple-mime-types.html

使用多种MIME类型测试REST相关推荐

  1. mime类型是什么类型_使用多种MIME类型测试REST

    mime类型是什么类型 1.概述 本文将重点介绍测试具有多种媒体类型/表示形式的RESTful服务. 这是有关使用Spring和基于Java的配置的Spring Security设置安全的RESTfu ...

  2. linux 添加mime类型,Linux MIME type

    什么是MIME Type MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理. MIME Type指定了文件的类型名称.描述.图标信息,同时通过与.d ...

  3. 服务器修改mime类型,服务器上设置mime类型

    服务器上设置mime类型 内容精选 换一换 资源包括静态语音,TTS放音以及短消息,在您进行流程编排前,需要先将涉及到的资源,包括语音.短信模板添加到系统中,才能继续配置流程. 开发过程中,您有任何问 ...

  4. 序列化包含多种不明类型的集合

    序列化包含多种不明类型的集合 代码:/Files/zhuqil/Kirin.rar 导言: 你是否曾经想过序列化构造对象,它里面有一个集合,这个集合包含接口或者抽象类?你是否不知道所有的你要序列化的类 ...

  5. html5之MIME类型

    MIME - Multipurpose Internet Mail Extensions,翻译过来就是多功能Internet邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件 ...

  6. nginx mime.types php,使用重写和有效的mime类型配置NGINX的正确方法

    我正在尝试测试NGINX并可能从Apache切换 . 我读过nginx的速度要快得多,但我希望能够做到这一点 . 我在使用NGINX的配置以匹配我的Apache设置时遇到问题 - 主要是重写规则 . ...

  7. MBTI性格类型测试

    MBTI性格类型测试 注意事项: 1.请在心态平和及时间充足的情况下才开始答题. 2.每道题目均有两个答案: A和 B.请仔细阅读题目,按照与你性格相符的程度分别给 A和 B赋予一个分数,并使一组中的 ...

  8. 从文件扩展名获取MIME类型

    本文翻译自:Get MIME type from filename extension 如何从文件扩展名中获取MIME类型? #1楼 参考:https://stackoom.com/question/ ...

  9. docx,pptx等正确的mime类型是什么?

    对于较早的* .doc文档,这已足够: header("Content-Type: application/msword"); 我应该为新的docx文档使用哪种mime类型? 还可 ...

最新文章

  1. vba 字体颜色_多掌握一些VBA语句,让自己书写代码更加顺畅
  2. 用ABAP来实现柱状图和饼状图的输出
  3. python diff函数_使用Python创建你自己的diff工具
  4. python工作岗位要求_Python就业:Python就业岗位职能要求解析
  5. oracle外部表迁移,海量数据迁移之外部表并行抽取
  6. UVA11021 Tribbles
  7. 160304-01、mysql数据库插入速度和读取速度的调整记录
  8. 从URL启动程序:也谈谈旺旺的页面启动
  9. Android渐变折线图,自定义View之颜色渐变折线图
  10. SPSS中T检验的作用以及使用前提
  11. DevOps知识地图
  12. “扣哒杯” AI世青赛公布2021-2022年度全国决赛个人获奖名单
  13. 联想笔记本小新air14,Fn+功能键/Insert键
  14. windows 2012下安装.NET框架时出现组件的文件跟组件清单中的验证信息不匹配,无法安装
  15. android+怎么分享图片大小,Android微信分享图片大于32k进行压缩
  16. 佳能打印机手机显示未连接服务器失败,佳能打印机连不上手机
  17. HTML 直播 RTMP流实时播放
  18. 9种小程序赚钱方法!看懂的人已经在行动了
  19. 数字孪生在能源、电力系统、电厂行业的应用实例
  20. 电机功率和转矩、转速之间的关系

热门文章

  1. ES6模板字符串【${}配合反单引号一起用】
  2. ssrs 基于表达式显示_基于表达式的访问控制
  3. enum.values_占用内存的Enum.values()方法
  4. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  5. 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答
  6. activiti 变量_如何在Activiti中使用瞬态变量
  7. apache camel_您的Apache Camel应用程序现在包括现成的文档
  8. shader weaver_具有自定义汇编程序,Weaver和运行时的可插拔知识
  9. 初学者指南:如何为Red Hat Process Automation Manager配置电子邮件服务任务
  10. 使用Java流和In-JVM-Memory的超低延迟查询