1

コマンドでsurefireプラグインを使用して完全に実行される統合テストがいくつかあります。

mvn -Dtest=path.to.test.classIT surefire:test

を使用してフェイルセーフプラグインで同じ統合テストを実行すると

mvn verify

テストは、依存関係がないことを示して失敗します (jackson lib、「応答クラスのメッセージ本文ライターが見つかりません」)。

必要な依存関係が pom with scope test に追加されます。シュアファイアとフェイルセーフのテスト実行方法の違いは何ですか?

もう少しコンテキスト:私のpomには次のものが含まれています:

...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <forkMode>never</forkMode>
        <threadCount>1</threadCount>
    </configuration>
</plugin>
...
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.9.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>openejb-cxf-rs</artifactId>
        <version>4.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>openejb-mockito</artifactId>
        <version>4.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <scope>provided</scope>
    </dependency>

テストクラスはapplicationcomposer

@RunWith(ApplicationComposer.class)
public class PdaServiceIT {

    ....
    @Configuration
    public Properties config() throws Exception {

        Properties properties = new Properties();

        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
        properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

        return properties;
    }
...
4

2 に答える 2

1

ここで何が起こっているのかよくわかりませんが、問題に関連している可能性のあるクラスの読み込みの問題に関する完全なドキュメント ページがあります。

https://maven.apache.org/surefire/maven-failsafe-plugin/examples/class-loading.html

このページでは、パラメーターforkMode=never(明らかに非推奨) を使用している間、プラグインは分離されたクラスローダーを使用する必要があることを説明しています。

分離されたクラス ローダーを持つことの制限の 1 つをここで説明します。

たとえば、システム プロパティjava.class.pathには jar が含まれません。アプリがこれに気付いた場合、問題が発生する可能性があります

この場合、少し難解であることに同意しますが、あなたの問題に関連していると考えるのをやめることはできません.

現在の構成を変更しようとしましたか? わかりませんが、おそらくforkModeandを削除してthreadCount、デフォルト構成がそれらすべてをどのように処理しているかを確認してください。

それがうまくいかないなら、私はしようとするだろう

forkCountuseSystemClassLoader、の 3 つの設定をいじりますuseManifestOnlyJar

ドキュメントが言うように。

于 2014-02-04T10:47:23.647 に答える
1

Json プロバイダーとして使用されているクラスがクラスパス上にないために、問題が発生した可能性があります。これは、クラスを含むモジュールを統合テストに追加することで解決できます。

...
@RunWith(ApplicationComposer.class)
public class PdaServiceIT {

    ...
    @Configuration
    public Properties config() throws Exception {

        Properties properties = new Properties();

        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
        properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

        return properties;
    }

    @Module
    public static Class<?>[] myJaxbProviders() {
        return new Class<?>[] { com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class };
    }
    ...
}

その後、maven-surefire プラグインと maven-failsafe プラグインの両方を使用すると、必要なクラスが利用可能になります。

同様の統合テストのセットアップについては、こちらで説明しています。

于 2014-02-06T07:29:04.817 に答える