目次

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

St​​ring

のスイッチ
ここで働いている構文
プロパティが次の場所で定義されていない場合、

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ベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。