2013-02-08 2 views
5

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

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

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

+0

который один вы используете, если не JUnit? – TheWhiteRabbit

+0

, если вы используете тесты POJO или TestNG, вы можете использовать @BeforeClass – TheWhiteRabbit

+0

@TechExchange Обновленный вопрос, чтобы уточнить, что я использую maven surefire – hertzsprung

ответ

7

Существует два варианта: решение maven и решение для безотказной работы. Наименее связанное решение состоит в том, чтобы выполнить плагин в фазе 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. Я не уверен, есть ли плагин 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. Это запустит/остановит службы, которые вы хотите. Затем, в безошибочный, вы можете указать пользовательский слушателя, используя:

<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

+0

Я не думаю, что первый вариант будет работать, потому что мне нужен доступ к экземпляру 'HttpServer' из «TestRule», но «RunListener» звучит многообещающе, спасибо! – hertzsprung

+0

для меня, как часть фазы предварительной интеграции, запускается сервер причалов. Последняя строка журнала: [INFO] Запустил сервер Jetty. После этого ничего не происходит. Он застревает. maven surefire отказоустойчивый плагин не выполняет тесты, а сервер приставок останавливается. Любая идея, что не так? Я использую ту же конфигурацию, которая указана вами. –

Смежные вопросы