1. 概要

この記事では、複数のメディアタイプ/表現を使用したRESTサービスのテストに焦点を当てます。

APIでサポートされている複数のタイプの表現を切り替えることができる統合テストを作成します。 目標は、サービスのまったく同じURIを使用して、まったく同じテストを実行できるようにすることです。異なるメディアタイプを要求するだけです。

2. 目標

すべてのRESTAPIは、1つ以上のメディアタイプを使用する表現としてリソースを公開する必要があります。 クライアントはAcceptヘッダーを設定して、サービスから要求する表現のタイプを選択します。

リソースは複数の表現を持つことができるため、サーバーは適切な表現を選択するメカニズムを実装する必要があります。 これは、コンテンツネゴシエーションとも呼ばれます。

したがって、クライアントが 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;
    }
}

これを見てみましょう:

  • まず、Spring3.1で導入された新しいEnvironment 抽象化がここで使用されます。この詳細については、Springでのプロパティの使用に関する詳細な記事を確認してください。
  • 環境からtest.mimeプロパティを取得し、それを使用して、作成するマーシャラーを決定します。ここでは、Java7スイッチオンString構文が機能しています。
  • 次に、プロパティがまったく定義されていない場合のデフォルトのマーシャラーは、JSONサポート用のJacksonマーシャラーになります
  • 最後に–この BeanFactory は、Spring3.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();
    }
}

これらのマーシャラーはSpringBean自体ではないことに注意してください。 その理由は、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

すでにデプロイされているRESTサービスに対して統合テストを実行するようにMavenが設定されている場合は、次を使用して実行できます。

mvn test -Dtest.mime=xml

または、これがビルドでMavenライフサイクルの統合テストフェーズを使用する場合:

mvn integration-test -Dtest.mime=xml

統合テストを実行するようにMavenビルドを設定する方法の詳細については、Mavenとの統合テストの記事を参照してください。

Jenkinsでは、次のようにジョブを構成する必要があります。

This build is parametrized

そして、文字列パラメーター test.mime =xmlが追加されました。

一般的なJenkins構成では、デプロイされたサービスに対して同じ統合テストのセットを実行する必要があります。1つはXMLを使用し、もう1つはJSON表現を使用します。

7. 結論

この記事では、複数の表現で機能するRESTAPIをテストする方法を示しました。 ほとんどのAPIは複数の表現でリソースを公開するため、これらすべてをテストすることが重要です。 それらすべてでまったく同じテストを使用できるという事実は、すばらしいことです。

このメカニズムの完全な実装(実際の統合テストを使用し、XML表現とJSON表現の両方を検証する)は、GitHubプロジェクトにあります。