使用多种MIME类型测试REST

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

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

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

相关文章

firewallD卸载Linux,在Ubuntu 18.04/16.04系统上安装和使用Firewalld的方法

本文介绍Firewalld在Ubuntu 18.04或Ubuntu 16.04发行版上的安装方法及基本用法。简介Firewalld是Linux防火墙管理工具&#xff0c;支持IPv4、IPv6、以太网桥和IPSet防火墙设置&#xff0c;它充当Linux内核的netfilter框架的前端&#xff0c;同时Firewalld是RHEL 7系列上的默认防…

JavaWeb学习中的小问题

1. HttpServletRequest和ServletRequest之间的区别&#xff1f; 再看别人项目的时候突然看到一句&#xff1a; ServletRequest request&#xff1b;HttpServletRequest hsRequest (HttpServletRequest) request;// 获取HttpServletRequest对象瞬间就有一点懵逼 &#xff0c;赶…

python 结构数组_Python数组

数组是一个容器&#xff0c;它可以容纳一定数量的项目&#xff0c;这些项目是相同的类型。 大部分数据结构都使用数组来实现它们的算法。 以下是理解数组(Array)概念的重要术语。元素 - 存储在数组中的每个项目称为元素。索引 - 数组中元素的每个位置都有一个数字索引&#xff…

广播 布局文件代码

<?xml version"1.0" encoding"utf-8"?><RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.android.com/apk/res-auto" xmlns:tools"http://schemas.android.com/…

PCGen的垃圾收集分析

介绍 我决定结合我的两个软件爱好&#xff0c;并在PCGen上进行一些分析&#xff0c; PCGen是一种流行的基于Java的开放源代码角色生成器&#xff0c;用于角色扮演游戏。 我用Censum &#xff0c;我们&#xff08; jClarity的&#xff09;新的垃圾收集日志分析工具来进行分析。 …

THINKPHP增删改查--(改)

1.CURD 控制器?>namespace Home\Controller;use Think\Controller;class CurdController extends Controller{ public function index(){ $db_student D(Student); $data_student $db_student->relation(true)->select();// dump($data_student); $this->assign…

Linux监控CPU关闭服务器,监控Linux服务器CPU和内存

利用脚本获取Linux服务器的CPU和内存。需要安装bc计算器yum install -y bc创建执行脚本计算CPU利用率&#xff0c;配置了5秒采样。执行脚本&#xff0c;5秒后输出采集日期|CPU负载|可用内存|总内存#!/bin/sh##echo user nice system idle iowait irq softirqCPULOG_1$(cat /pro…

springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]项目调优作为一名工程师&#xff0c;项目调优这事&#xff0c;是必须得熟练掌握的事情。在SpringBoot项目中&#xff0c;调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件 application.p…

移动端原生js,css3实现轮播图

一、功能需求 1、自动播放2、滑动切换3、点击切换 二、思路分析 html代码&#xff1a; <div class"container">   <ul class"list clearfix">   <li class"item fl item5">图5</li>   <li class"item fl …

关于换行这个动作,win 和 mac 的实现

‘\r是回车&#xff0c;前者使光标到行首&#xff0c;&#xff08;carriage return&#xff09;\n是换行&#xff0c;后者使光标下移一格&#xff0c;&#xff08;line feed&#xff09;\r 是回车&#xff0c;return\n 是换行&#xff0c;newline对于换行这个动作&#xff1a;u…

你好骆驼:自动文件传输

Apache Camel在其主页上 &#xff08;以及Camel用户指南中 &#xff09;将其描述为“基于已知企业集成模式的通用开源集成框架”。 Camel框架基于《 企业集成模式 》一书&#xff0c;并提供了该书中描述的模式的实现 。 我看一下这篇文章中使用Camel的“ Hello World”类型示例…

Linux 常用命令二 pwd cd

一、pwd命令 显示整个路径名&#xff1a; wangwang:~$ pwd /home/wang 二、cd命令 切换到其他路径&#xff08;相对路径方式&#xff09;&#xff1a; wangwang:~$ cd workpalce/ wangwang:~/workpalce$ pwd /home/wang/workpalce 切换到其他路径&#xff08;绝对路径方式&…

3dobject用什么打开_第一次用开塞露是什么感觉?网友:像打开了新世界的大门

第一次用开塞露是什么感觉&#xff1f;网友:像打开了新世界的大门我妈说我小时候便秘去医院&#xff0c;医生给开了支开塞露&#xff0c;然后在医院的公厕里使用的&#xff0c;我妈的描述是:“要不是我手挪走的快点&#xff0c;就直接喷我手了”。。。。。。。。。。。。。。。…

linux root邮箱地址,linux – 如何将root的电子邮件转发到外部电子邮件地址?

我家里有一台小型服务器(Ubuntu 10.04),我想将root的电子邮件转发到我的gmail托管域,以获取安全通知,什么不是.我把所有东西都撕掉了,然后从头开始跑到other issues.我现在有sendmail工作,我可以发邮件到someexternal.com并收到邮件.但是,向/root/.forward添加地址实际上并不转…

RHEL6.4 xclock安装小记

http://blog.sina.com.cn/s/blog_623630d50101tc67.html转载于:https://www.cnblogs.com/Baronboy/p/7077911.html

Java 7中对String.substring的更改

众所周知&#xff0c;在您生成相同源字符串的许多子字符串的情况下&#xff0c;Java会优化子字符串操作。 它通过使用(value, offset, count)存储信息的方式来做到这一点。 请参阅以下示例&#xff1a; 在上图中&#xff0c;您会看到字符串“ Hello”和“ World&#xff01;”…

原生js创建模态框

1.效果图如下&#xff1a; 2.代码如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

python查询oracle数据库_python针对Oracle常见查询操作实例分析

本文实例讲述了python针对Oracle常见查询操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.子查询(难)&#xff1a;当进行查询的时候&#xff0c;发现需要的数据信息不明确&#xff0c;需要先通过另一个查询得到&#xff0c;此查询称为子查询&#xff1b;执行顺序…

按钮事件处理(3)

在进行gui编程时&#xff0c;我们最常使用的控件时按钮&#xff0c;在java中JButton类代表了按钮。它的类层次结构图是&#xff1a; java.lang.Object|_ java.awt.Component|_java.awt.Container|_javax.swing.JComponent|_javax.swing.AbstractButton|_javax.swing.JButton我们…

linux下I2C驱动发送IO时序,Linux I2C 驱动阅读的碰到的一些网上没有提到的东西

# re: Linux I2C 驱动阅读的碰到的一些网上没有提到的东西 回复 更多评论2009-04-11 13:39 by 初学都楼主&#xff0c;你好。我看了你那篇《Linux I2C核心、总线与设备驱动[转]》&#xff0c;让我明白了不少&#xff0c;不过我还是有些不明白的地方&#xff0c;想请教一下。我…