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>
...

我已经filterDeploymentDescriptor在 maven-ejb-plugin 上激活,以便告诉它过滤(替换)ejb-jar.xml 中的值:

<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 属性“主机”获取所需的特定于配置文件的值:

<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 [EJBContainer.createEJBContainer()] 的嵌入式企业 Bean 容器运行 EJB 单元测试时,maven-ejb-plugin 似乎忽略了 filterDeploymentDescriptor=true。尽管我使用相同的“dev”配置文件运行 maven,但 EJB 看到的是“${theHost}”而不是“localhost”。

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 回答
0

理想情况下,您可以为 env-entry 指定一个外部“绑定”。我知道这可能与 WebSphere Application Server (通过EnvEntry.Value 属性)有关,但我不知道 Glassfish 是否可能。

作为一种解决方法,您可以声明用于注入的 env-entry,然后在 PostConstruct 中检查容器是否注入了任何值(即,在部署到服务器之前不要指定 env-entry-value)。如果你只使用 JNDI,你可以用 try/catch(NameNotFoundException) 做同样的事情。

@Resource(name="host")
private String host;

@PostConstruct
public void postConstruct() {
  if (host == null) {
    // Not configured at deployment time.
    host = System.getProperty("test.host");
  }
}
于 2013-06-26T00:50:22.727 回答