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