2

有人知道嵌入式 Glassfish 吗?我想运行一些 EJB 测试,但我不想在每次运行测试时启动和停止 glassfish-embedded。

根据插件文档,我应该把它放在 POM 中:

            <plugin>
            <groupId>org.glassfish</groupId>
            <artifactId>maven-embedded-glassfish-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <app>target/ejbcontainer-1.0-SNAPSHOT.jar</app>
                <name>test</name>
                <ports>
                    <http-listener>8080</http-listener>
                    <https-listener>8181</https-listener>
                </ports>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>start</goal>  
                        <goal>deploy</goal>
                        <goal>undeploy</goal>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin> 
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <configuration>
                <skip>true</skip>
            </configuration>
            <executions>
                <execution>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>

这一切都很好。我可以“运行”这个嵌入式 glassfish,并在我的控制台中得到它,这证明它已经启动并正在运行:

信息:测试在 1,124 毫秒内成功部署。PlainTextActionReporterSUCCESSDescription:部署 AdminCommandApplication 部署名称测试。[name=test 2013 年 12 月 16 日 6:03:29 PM PluginUtil doDeploy 信息:已部署测试按 ENTER 重新部署,X 退出

但是,当我“运行”我的测试文件时,会创建一个嵌入式 glassfish的新实例

我的测试文件没有选择当前正在运行的容器。

如果有帮助,这是一个测试文件:

public class Test extends TestCase {

    private Context ctx;
    private EJBContainer ejbContainer;

    public Test(String testName) {
        super(testName);
    }

    @BeforeClass
    public void setUp() {
        ejbContainer = EJBContainer.createEJBContainer();

        System.out.println("Opening the container");

        ctx = ejbContainer.getContext();
    }

    @AfterClass
    @Override
    public void tearDown() {
        ejbContainer.close();
        System.out.println("Closing the container");
    }

    @org.junit.Test
    public void testApp() throws Exception {
        TemperatureConverter converter = (TemperatureConverter) ctx.lookup("java:global/classes/TemperatureConverter");
        assertNotNull(converter);
    }
}
4

1 回答 1

2

刚刚发现了这个问题,因为我自己一直在玩嵌入式 glassfish,并且遇到了一些配置问题,主要与日志输出有关。

我使用嵌入式 glassfish 进行测试的方式是将其绑定到 Maven 集成测试阶段,例如

          <executions>
            <!-- Start embedded GlassFish -->
            <execution>
                <id>start</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>start</goal>
                </goals>
            </execution>
            <execution>
                <id>deploy</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>deploy</goal>
                </goals>
            </execution>
            <execution>
                <id>stop</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>undeploy</goal>
                    <goal>stop</goal>
                </goals>
            </execution>
          </executions>

并使用Maven Failsafe Plugin执行测试作为验证目标的一部分。不过,这些变得更像集成测试。如果您使用 IT 后缀命名您的测试文件,例如 myTestFileIT.java,那么它们应该会被自动拾取。

然后,您可以通过执行以下 Maven 命令来运行测试:

 mvn verify

我最初使用的是嵌入式 Jetty,这是我让这个设置工作得非常好的地方,我发现 glassfish 更加繁琐,而且完全按照我的需要进行配置非常耗时。

希望这对您的问题有所帮助。

于 2014-01-03T10:59:20.857 回答