Как я могу использовать JUnit RunListener в Eclipse?

Я написал простой RunListener для JUnit, который неплохо работает с Maven. Я мог бы зарегистрировать его для плагина maven-failsafe через

<properties>
    <property>
        <name>listener</name>
        <value>com.asml.lcp.middleware.common.jboss.test.tps.TestDocumentationListener</value>
    </property>
</properties>

и увидеть правильный вывод от слушателя.

Теперь я хочу зарегистрировать тот же самый RunListener в Eclipse, чтобы видеть там тот же вывод, когда я запускаю тесты.

Это возможно? В целях тестирования и для согласованности было бы неплохо иметь такой же вывод.


person Rick-Rainer Ludwig    schedule 10.05.2012    source источник


Ответы (3)


Да, это возможно. По сути, вам нужно реализовать свой собственный Runner, и внутри метода запуска вы можете добавить собственный прослушиватель запуска. Я понял это на основе этот пост, пункт 2.

вот мой слушатель

public class TestLogger extends RunListener
{
    public void testFinished(Description description)
    {
        System.out.println("Successful " + description.getMethodName());
    }
}

а вот и мой бегун

public class TestRunner extends BlockJUnit4ClassRunner
{
    public TestRunner(Class<?> klass) throws InitializationError
    {
        super(klass);
    }

    @Override
    public void run(RunNotifier notifier)
    {
        notifier.addListener(new TestLogger());   // THIS IS THE IMPORTANT LINE
        super.run(notifier);
    }
}

и вот мой реальный тест junit

@RunWith(TestRunner.class)           // THIS LINE IS ALSO IMPORTANT
public class MyTest1
{
    @Test
    public void Test1() throws Exception
    {
        if (Math.random() < .5) throw new Exception("ouch");
        assertFalse(Math.random() < .5);
    }
}    

Вы можете запустить MyTest1 или метод Test1, используя контекстное меню в Eclipse, и он вызовет testLogger, как и следовало ожидать.

person John Henckel    schedule 21.11.2014
comment
Это не совсем то, что я искал, потому что я не люблю усложнять реализацию теста для логирования. Хотел добавить логирование вне тестов, но пока решение лучшее и результат в конце такой как хотелось. Я отмечаю этот ответ как решение. - person Rick-Rainer Ludwig; 26.01.2015

У меня есть набор тестов, для которых требуется база данных. Я хочу создать базу данных в начале их выполнения и удалить в конце.

Из maven я также добавил RunListener в плагин maven-surefire, и он отлично работает. Также я добавил переменную системного свойства с именем ismaven. Когда я выполняю тест из maven, эта переменная инициализируется, но когда я выполняю тесты из Eclipse, эта переменная имеет значение null (я обращаюсь к переменной с помощью System.getProperty).

<configuration>
  <properties>
    <property>
      <name>listener</name>
      <value>com.mycompany.MyRunListener</value>
    </property>
  </properties>
  <systemPropertyVariables>
    <ismaven>true</ismaven>
  </systemPropertyVariables>
</configuration>

Все мои тесты базы данных наследуются от класса, который имеет методы @BeforeClass и @AfterClass. Эти методы проверяют, выполняется ли тест Maven или Eclipse, проверяя значение свойства ismaven. Если тест выполняется maven, свойство ismaven имеет значение, и они делают что угодно. Но если тест выполняется Eclipse, переменная ismaven имеет значение null, и они запускают (@BeforeClass) или останавливают (@AfterClass) базу данных:

@BeforeClass
public static void checkIfStartDatabase() {   
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, start the database
  if (ismaven == null) {
    startDatabase();
  }
}

@AfterClass
public static void checkIfStopDatabase() {
  String ismaven = System.getProperty("ismaven");
  // If it is not maven, stop the database
  if (ismaven == null) {
    stopDatabase();
  }
}

Это решение не решит вашу проблему на 100%, но если вы его реализуете, вы сможете выполнять (и отлаживать) все тесты одного класса JUnit с помощью Eclipse, а также выполнять все тесты вашего проекта с помощью Maven с гарантией того, что вы будет выполнять один раз фрагмент кода до или после выполнения всех ваших тестов.

person Jorge Piera Llodrá    schedule 03.10.2014

Я провел еще несколько исследований по этому вопросу. Насколько я вижу сейчас, нет возможности добавить прослушиватель запуска, когда JUnit работает в Eclipse.

person Rick-Rainer Ludwig    schedule 05.07.2012