如何在Eclipse中使用JUnit RunListener?

时间:2012-05-10 15:37:12

标签: eclipse maven junit maven-failsafe-plugin

我为JUnit编写了一个简单的RunListener,它与Maven一起运行良好。我可以通过

为maven-failsafe-plugin注册它
<properties>
    <property>
        <name>listener</name>
        <value>com.asml.lcp.middleware.common.jboss.test.tps.TestDocumentationListener</value>
    </property>
</properties>

并查看侦听器的正确输出。

现在我想在Eclipse中注册相同的RunListener,以便在运行测试时看到相同的输出。

这可能吗?出于测试目的并保持一致,最好有相同的输出。

3 个答案:

答案 0 :(得分:2)

我有一组需要执行数据库的测试。我想在执行开始时创建数据库并在最后删除它。

从maven我还添加了一个 RunListener 到maven-surefire-plugin,它运行正常。我还添加了一个名为 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%解决您的问题,但如果您实现它,您可以使用Eclipse执行(和调试)一个JUnit类的所有测试,您也可以使用Maven执行项目的所有测试保证在执行所有测试之前或之后执行一段代码。

答案 1 :(得分:1)

是的,有可能。基本上你必须实现自己的Runner,在run方法中,你可以添加一个自定义的运行监听器。我根据this post,第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);
    }
}    

您可以使用Eclipse中的上下文菜单运行MyTest1或Test1方法,它将像您期望的那样调用testLogger。

答案 2 :(得分:0)

我对此做了更多的研究。据我所知,没有办法在Eclipse中运行JUnit运行监听程序。