Выполнение кода до и после всех тестов при выполнении surefire

у меня есть Гризли HttpServer который я хочу запустить в течение всего времени выполнения тестовой группы. Кроме того, я хочу взаимодействовать с глобальным экземпляром HttpServer из @Rule внутри самих испытаний.

поскольку я использую maven Surefire, а не тестовые наборы JUnit, я не могу использовать @BeforeClass/@AfterClass на сам тест люкс.

прямо сейчас, все, о чем я могу думать, это лениво инициализировать статическое поле и остановить сервер от Runtime.addShutdownHook() -- не мило!

1 ответов


существует два варианта: решение maven и верное решение. Наименее связанное решение-выполнить плагин в pre-integration-test и post-integration-test этап. См.введение в жизненный цикл сборки-Lifecycle Reference. Я не знаком с grizzly, но вот пример использования jetty:

 <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 is pre-integration-test и stop is post-integration-test. Я не уверен, есть ли плагин grizzly 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, Используя JUnit, используя пользовательские слушатели и репортеры