在surefire执行中的所有测试之前和之后运行代码

时间:2013-02-08 11:35:38

标签: java junit maven-surefire-plugin grizzly

我想要在测试组执行的整个过程中运行Grizzly HttpServer。另外,我想在测试中自己与@Rule的全局HttpServer实例进行交互。

由于我使用Maven Surefire而不是使用JUnit测试套件,因此我无法在测试套件本身上使用@BeforeClass / @AfterClass

现在,我能想到的只是懒洋洋地初始化静态字段并从Runtime.addShutdownHook()停止服务器 - 不太好!

1 个答案:

答案 0 :(得分:8)

有两个选项,maven解决方案和surefire解决方案。最少耦合的解决方案是在pre-integration-testpost-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-teststop的相位为post-integration-test。我不确定是否有一个灰熊maven插件,但你可以改用maven-antrun-plugin

第二个选项是使用JUnit RunListenerRunListener监听测试事件,例如测试开始,测试结束,测试失败,测试成功等。

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