使用多种MIME类型测试REST
1.概述
本文將重點(diǎn)介紹測(cè)試具有多種媒體類型/表示形式的RESTful服務(wù)。 這是關(guān)于使用Spring和基于Java的配置的Spring Security設(shè)置安全的RESTful Web Service的系列文章的第十篇。
REST with Spring系列:
- 第1部分 – 使用Spring 3.1和基于Java的配置引導(dǎo)Web應(yīng)用程序
- P藝術(shù)2 - 構(gòu)建RESTful Web服務(wù)使用Spring 3.1和Java配置
- P藝術(shù)3 - 保護(hù)RESTful Web服務(wù)使用Spring Security 3.1
- 第4部分 – RESTful Web服務(wù)可發(fā)現(xiàn)性
- 第5部分 – 使用Spring進(jìn)行REST服務(wù)發(fā)現(xiàn)
- 第6部分 – 使用Spring Security 3.1的RESTful服務(wù)的基本身份驗(yàn)證和摘要身份驗(yàn)證
- 第7部分 – Spring的REST分頁(yè)
- 第8部分 – 使用Spring Security對(duì)RESTful服務(wù)進(jìn)行身份驗(yàn)證
- 第9部分 – 帶有Spring的REST的ETag
2.目標(biāo)
任何RESTful服務(wù)都需要使用某種媒體類型將其資源作為表示形式公開(kāi),并且在許多情況下,還需要多個(gè)媒體類型。 客戶端將設(shè)置Accept標(biāo)頭以選擇其從服務(wù)中請(qǐng)求的表示形式。 由于資源可以具有多種表示形式,因此服務(wù)器將必須實(shí)現(xiàn)負(fù)責(zé)選擇正確表示形式的機(jī)制-也稱為內(nèi)容協(xié)商。 因此,如果客戶端請(qǐng)求application / xml ,則它應(yīng)該獲得Resource的XML表示,如果客戶端請(qǐng)求application / json ,則應(yīng)該獲得JSON。
本文將說(shuō)明如何編寫(xiě)集成測(cè)試,該測(cè)試能夠在RESTful Service支持的多種表示形式之間切換。 目標(biāo)是能夠使用完全相同的服務(wù)URI運(yùn)行完全相同的測(cè)試,而只是要求使用不同的媒體類型。
3.測(cè)試基礎(chǔ)架構(gòu)
我們將從為編組人員定義一個(gè)簡(jiǎn)單的接口開(kāi)始–這將是允許測(cè)試在不同媒體類型之間切換的主要抽象:
public interface IMarshaller {...String getMime(); }然后,我們需要一種基于某種形式的外部配置來(lái)初始化正確的編組器的方法。 對(duì)于這種機(jī)制,我們將使用Spring FactoryBean來(lái)初始化編組器,并使用一個(gè)簡(jiǎn)單的屬性來(lái)確定要使用的編組器:
@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;} }讓我們來(lái)看一下:
- 首先,在這里使用Spring 3.1中引入的新的Environment抽象-有關(guān)更多信息,請(qǐng)查看帶有Spring的屬性文章
- 從環(huán)境中檢索test.mime屬性 ,并用于確定要?jiǎng)?chuàng)建哪個(gè)封送處理程序-一些Java 7在這里使用String語(yǔ)法
- 接下來(lái),如果根本沒(méi)有定義該屬性,則默認(rèn)的marshaller將成為支持JSON的Jackson marshaller
- 最后–此BeanFactory僅在測(cè)試場(chǎng)景中處于活動(dòng)狀態(tài),因?yàn)槭褂昧薙pring 3.1中引入的新@Profile支持
就是這樣–該機(jī)制能夠根據(jù)test.mime屬性的值在編組器之間進(jìn)行切換。
4. JSON和XML編組器
繼續(xù),我們將需要實(shí)際的marhsaller實(shí)施-每個(gè)受支持的媒體類型一個(gè)。
對(duì)于JSON,我們將使用Jackson作為基礎(chǔ)庫(kù):
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();} }請(qǐng)注意,這些編組器未定義為它們自己的Spring組件。 原因是它們將由TestMarshallerFactory引導(dǎo)到Spring上下文中,因此不需要直接使它們成為組件。
5.同時(shí)使用JSON和XML來(lái)使用服務(wù)
在這一點(diǎn)上,我們應(yīng)該能夠?qū)σ巡渴鸬腞ESTful服務(wù)進(jìn)行全面的集成測(cè)試。 使用編組器很簡(jiǎn)單–將IMarshaller直接注入到測(cè)試中即可:
@ActiveProfiles({ 'test' }) public abstract class SomeRestLiveTest {@Autowiredprivate IMarshaller marshaller;// tests... }當(dāng)然,Spring將注入的確切編組將由test.mime屬性的值確定 ; 這可以從屬性文件中獲取,也可以直接在測(cè)試環(huán)境中手動(dòng)設(shè)置。 但是,如果沒(méi)有為此屬性提供值,則TestMarshallerFactory將僅使用默認(rèn)的編組器JSON編組器。
6. Maven和詹金斯
如果將Maven設(shè)置為針對(duì)已部署的RESTful服務(wù)運(yùn)行集成測(cè)試,則可以這樣運(yùn)行:
mvn test -Dtest.mime=xml或者,如果此構(gòu)建使用Maven生命周期的集成測(cè)試階段:
mvn integration-test -Dtest.mime=xml有關(guān)如何使用這些階段,以及如何建立一個(gè)Maven構(gòu)建,使其應(yīng)用程序預(yù)集成測(cè)試目標(biāo)的部署約束,在集成測(cè)試目標(biāo),然后關(guān)運(yùn)行集成測(cè)試的詳細(xì)信息在post-integration-test中查看已部署的服務(wù),請(qǐng)參閱與Maven進(jìn)行集成測(cè)試 。
使用Jenkins時(shí) ,作業(yè)必須配置為:
This build is parameterized 并添加了String參數(shù) : test.mime = xml 。
常見(jiàn)的Jenkins配置是必須針對(duì)已部署的服務(wù)運(yùn)行運(yùn)行同一組集成測(cè)試的作業(yè)-一個(gè)使用XML,另一個(gè)使用JSON表示。
7.結(jié)論
本文介紹了如何正確測(cè)試REST API。 大多數(shù)API的確會(huì)以多種表示形式發(fā)布其資源,因此測(cè)試所有這些表示形式至關(guān)重要,因此使用完全相同的測(cè)試非常酷。
要在實(shí)際集成測(cè)試中全面驗(yàn)證此機(jī)制,以驗(yàn)證所有資源的XML和JSON表示,請(qǐng)查看github項(xiàng)目 。
參考:來(lái)自baeldung博客的JCG合作伙伴 Eugen Paraschiv對(duì)具有多種MIME類型的REST進(jìn)行了測(cè)試 。
翻譯自: https://www.javacodegeeks.com/2013/01/testing-rest-with-multiple-mime-types.html
總結(jié)
以上是生活随笔為你收集整理的使用多种MIME类型测试REST的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑开机点东西就卡死(电脑开机一点东西就
- 下一篇: PCGen的垃圾收集分析