我想要在测试组执行的整个过程中运行Grizzly HttpServer
。另外,我想在测试中自己与@Rule
的全局HttpServer实例进行交互。
由于我使用Maven Surefire而不是使用JUnit测试套件,因此我无法在测试套件本身上使用@BeforeClass
/ @AfterClass
。
现在,我能想到的只是懒洋洋地初始化静态字段并从Runtime.addShutdownHook()
停止服务器 - 不太好!
答案 0 :(得分:8)
有两个选项,maven解决方案和surefire解决方案。最少耦合的解决方案是在pre-integration-test
和post-integration-test
阶段执行插件。见Introduction to the Build Lifecycle - Lifecycle Reference。我不熟悉灰熊,但这是一个使用码头的例子:
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<configuration>
<contextPath>/xxx</contextPath>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
请注意,start
的相位为pre-integration-test
,stop
的相位为post-integration-test
。我不确定是否有一个灰熊maven插件,但你可以改用maven-antrun-plugin。
第二个选项是使用JUnit RunListener。 RunListener
监听测试事件,例如测试开始,测试结束,测试失败,测试成功等。
public class RunListener {
public void testRunStarted(Description description) throws Exception {}
public void testRunFinished(Result result) throws Exception {}
public void testStarted(Description description) throws Exception {}
public void testFinished(Description description) throws Exception {}
public void testFailure(Failure failure) throws Exception {}
public void testAssumptionFailure(Failure failure) {}
public void testIgnored(Description description) throws Exception {}
}
所以你可以听RunStarted和RunFinished。这些将启动/停止您想要的服务。然后,在surefire中,您可以使用以下命令指定自定义侦听器:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<properties>
<property>
<name>listener</name>
<value>com.mycompany.MyResultListener,com.mycompany.MyResultListener2</value>
</property>
</properties>
</configuration>
</plugin>
这是Maven Surefire Plugin, Using JUnit, Using custom listeners and reporters