1

展開にはいくつかのプロファイルが必要です。Maven POM で、プロファイル「dev」とプロパティ「theHost」を (localhost として) 定義しました。

<profiles>
  <profile>
    <id>dev</id>
    <activation>
      <activeByDefault>true</activeByDefault> <!-- use dev profile by default -->
    </activation>
    <build>
    </build>
    <properties>
      <theHost>localhost</theHost>
    </properties>
  </profile>
...

filterDeploymentDescriptorejb-jar.xml の値をフィルタリング (置換) するように指示するために、maven-ejb-plugin でアクティブにしました。

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <version>2.3</version>
    <configuration>
      <ejbVersion>3.1</ejbVersion>
-->   <filterDeploymentDescriptor>true</filterDeploymentDescriptor>
    </configuration>
</plugin

最後に、ejb-jar.xml を参照し${theHost}て、@Resource 属性「host」の目的のプロファイル固有の値を取得します。

<session>
  <ejb-name>MongoDao</ejb-name>
  <ejb-class>com.coolcorp.MongoDao</ejb-class>
  <session-type>Stateless</session-type>
  <env-entry>
    <env-entry-name>host</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>${theHost}</env-entry-value>
  </env-entry>
...

これはすべて、通常の Maven ビルドでうまく機能します。しかし、GlassFish の Embedded Enterprise Bean Container [EJBContainer.createEJBContainer()] を使用して EJB 単体テストを実行すると、maven-ejb-plugin が filterDeploymentDescriptor=true を無視するようです。同じ「dev」プロファイルで maven を実行していますが、EJB には「localhost」ではなく「${theHost}」が表示されます。

mvn.bat -Pdev test

単体テストの実行時に置換が機能しない理由を知っている人はいますか? ejb-jar.xml のフィルタリングが行われるように、特に単体テスト用に定義しなければならないものはありますか? または、異なるプロファイルが存在する場合に EJB を単体テストするためのより良いアプローチはありますか?

4

2 に答える 2

0

bkail の提案に基づく回避策: 単体テスト専用のシステム プロパティを設定し、postConstruct でそれを検出します。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.14.1</version>
            <configuration>
                <skip>false</skip>
                <argLine>-Xmx1g -XX:MaxPermSize=128m</argLine>
                <reuseForks>false</reuseForks> <!-- with reuse the EJB timer service would fail -->
                <systemPropertyVariables>
                    <is.unittest>true</is.unittest>
                </systemPropertyVariables>
            </configuration>
        </plugin>

そして、@PostConstruct で注釈が付けられた Java メソッドで:

    // Override values that were not substituted in ejb-jar.xml
    if (Boolean.getBoolean("is.unittest")) {
        host = "localhost";
        port = "27017";
        authenticationRequired = false;
    }
于 2013-06-26T07:43:13.507 に答える