使用多種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.pswp.cn/news/370198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370198.shtml
英文地址,請注明出處:http://en.pswp.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;想請教一下。我…