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. std::shuffle-c++
  2. tree树的展示,check树的展示,json数据转zree树格式数据
  3. stackoverflow上Java相关回答整理翻译FAQ top 100
  4. openmv串口数据 串口助手_Qt小项目之串口助手控制LED
  5. 关于sql中的with(nolock)
  6. 前端学习(1678):前端系列实战课程之声明和创建游戏地图
  7. TensorFlow 多任务学习
  8. java电子通讯录毕业设计_(C)JAVA001电子通讯录(带系统托盘)
  9. macOS Mojave 升级到macOS Monterey
  10. android游戏模式,注重游戏体验 Android 12提供原生游戏模式
  11. python--线性回归
  12. [转]如何正确查看Linux机器内存使用情况
  13. 三维重建——相机几何参数标定
  14. 第三季-第15课-信号通讯编程
  15. c语言入门介绍 Hello, World
  16. excel组合汇总_Excel汇总20151102
  17. hive删除EXTERNAL外表
  18. python通达信自动交易_【其他】通达信程序化交易新发现,通达信dll下单
  19. linux exclude用法,Linux tar exclude参数的用法
  20. 在线大学计算机资源,计算机专业常用网站及数据库-计算机及自动化专业网上资源.ppt...

热门文章

  1. 下载的c语言程序代码怎么运行,CFree怎么运行程序 编译运行C语言程序代码的方法...
  2. javafx窗体程序_JavaFX实际应用程序:SkedPal
  3. 斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘
  4. vaadin_Vaadin和DukeScript中的Hello World
  5. ejb能调用另一个ejb吗_异步EJB只是一个Gi头吗?
  6. jvm 架构_不可变的基础架构,热部署和JVM
  7. java转换为c#_C#vs Java哪一个更快? 将25k C#转换为Java(2)
  8. jvm7 jvm8_我们真的仍然需要32位JVM吗?
  9. springmvc jpa_使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置
  10. CUBA 7的新功能