複数のMIMEタイプでRESTをテストする
目次
-
link:#consume
json
xml[
5.
JSONとの両方でサービスを利用する
XML]
リンク:#maven__jenkins[
6 ** MavenとJenkins]
1概要
この記事では、
複数のメディアタイプ/表現を使用したRESTサービスのテスト
に焦点を当てます。
APIでサポートされている複数の種類の表現を切り替えることができる統合テストを作成します。目標は、まったく異なるテストを実行して、サービスのまったく同じURIを消費し、異なるメディアタイプを要求することです。
2目標
あらゆるREST APIは、ある種のメディアタイプを使用した表現としてリソースを公開する必要があります。 ** クライアントは
Accept
ヘッダーを設定して、サービスから要求する表現の種類を選択します。
Resourceは複数の表現を持つことができるので、サーバーは正しい表現を選択する責任を負うメカニズムを実装する必要があります – これは
Content Negotiation
としても知られています。したがって、クライアントが
application/xml
を要求した場合はリソースのXML表現を取得し、
application/json
を要求した場合はJSONを取得する必要があります。
3テストインフラストラクチャ
マーシャラーのためのシンプルなインターフェースを定義することから始めましょう – これはテストが異なるメディアタイプの間で切り替えることを可能にするであろう主要な抽象化でしょう:
public interface IMarshaller {
...
String getMime();
}
それから、何らかの外部設定に基づいて適切なマーシャラを初期化する方法が必要です。このメカニズムでは、Spring
FactoryBean
を使用してマーシャラを初期化し、単純なプロパティを使用してどのマーシャラを使用するかを決定します。
@Component
@Profile("test")
public class TestMarshallerFactory implements FactoryBean<IMarshaller> {
@Autowired
private 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
抽象化は、
ここで使用されています – このチェックの詳細については
link:/properties-with-spring
test.mime
プロパティ** は環境から取得され使用されます
どのマーシャラを作成するかを決定するには – いくつかのJava 7
String
のスイッチ
ここで働いている構文
プロパティが次の場所で定義されていない場合、
next、
デフォルトのマーシャラ**
すべて、JSONサポートのジャクソンマーシャラーになるでしょう
** 最後に – この
BeanFactory
はテストシナリオでのみ有効です。
Spring 3.1でも導入された新しい
@ Profile
のサポートが使用されています
それはそれです – メカニズムは
test.mime
プロパティの値が何であるかに基づいてマーシャラーを切り替えることができます。
** 4 JSONとXMLマーシャラー
**
先に進むと、サポートされているメディアタイプごとに1つずつ、実際のマーシャラー実装が必要になります。
JSONでは、基盤となるライブラリとして
Jackson
を使用します。
public class JacksonMarshaller implements IMarshaller {
private ObjectMapper objectMapper;
public JacksonMarshaller() {
super();
objectMapper = new ObjectMapper();
}
...
@Override
public 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 Bean自体ではありません。その理由は、それらが
TestMarshallerFactory
によってSpringコンテキストにブートストラップされるので、それらを直接コンポーネントにする必要はありません。
5 JSONとXMLの両方でサービスを利用する
この時点で、デプロイされたサービスに対して完全な統合テストを実行できるはずです。マーシャラーの使い方は簡単です。IMarshaller__はテストに直接挿入されるだけです。
@ActiveProfiles({ "test" })
public abstract class SomeRestLiveTest {
@Autowired
private IMarshaller marshaller;
//tests
...
}
Springによって投入される正確なマーシャラは、もちろん
test.mime
プロパティの値によって決定されます。これは、プロパティファイルから取得することも、テスト環境に手動で設定することもできます。
ただし、このプロパティに値が
指定されていない
場合、
TestMarshallerFactory
は単にデフォルトのマーシャラー(JSONマーシャラー)に戻ります。
6. MavenとJenkins
MavenがすでにデプロイされているRESTサービスに対して統合テストを実行するように設定されている場合は、次のように実行できます。
mvn test -Dtest.mime=xml
あるいは、これがビルドでMavenライフサイクルの
integration-test
フェーズを使用している場合:
mvn integration-test -Dtest.mime=xml
これらのフェーズの使用方法、およびアプリケーションのデプロイメントを
pre-integration-test
ゴールにバインドするようにMavenビルドをセットアップする方法の詳細については、
integration-test
ゴールで統合テストを実行してからシャットダウンしてください。展開されたサービスは
post-integration-test
にあります。リンク:/maven-cargo-pluginとの統合テスト[__ Mavenによるテストの統合]の記事を参照してください。
Jenkinsでは、ジョブは次のように構成されている必要があります。
This build is parametrized
そして
Stringパラメータ
:
test.mime = xml
が追加されました。
一般的なJenkinsの設定では、デプロイされたサービスに対して同じ一連の統合テストを実行するという作業が必要になります。1つはXMLを使用し、もう1つはJSON表現を使用します。
7. 結論
この記事では、複数の表現を扱うREST APIをテストする方法を説明しました。ほとんどのAPIはリソースを複数の表現で公開しているため、これらすべてをテストすることが不可欠です。それらすべてにまったく同じテストを使用できるという事実は、ただ素晴らしいです。
このメカニズムの完全な実装 – 実際の統合テストを使用してXMLとJSON表現の両方を検証する – はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa#readme[GitHubプロジェクト]これはEclipseベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。