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