【问题标题】:How can I use a JUnit RunListener in Eclipse?如何在 Eclipse 中使用 JUnit RunListener?
【发布时间】:2012-05-19 05:33:52
【问题描述】:

我为 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 以在运行测试时看到相同的输出。

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

【问题讨论】:

    标签: eclipse maven junit maven-failsafe-plugin


    【解决方案1】:

    我有一组需要执行数据库的测试。我想在执行开始时创建数据库并在结束时将其删除。

    在 maven 中,我还向 maven-surefire-plugin 添加了一个 RunListener,它工作正常。我还添加了一个名为 ismaven 的系统属性变量。当我从 maven 执行测试时,此变量已初始化,但当我从 Eclipse 执行测试时,此变量为空(我使用 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 执行项目的所有测试保证在执行所有测试之前或之后执行一次代码。

    【讨论】:

      【解决方案2】:

      是的,这是可能的。基本上你必须实现你自己的 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。

      【讨论】:

      • 这不是我所寻找的,因为我不喜欢增加日志测试实现的复杂性。我想在测试之外添加日志记录,但解决方案是迄今为止最好的,最后的结果也符合要求。我将此答案标记为解决方案。
      【解决方案3】:

      我对此做了更多的研究。据我现在所见,JUnit 在 Eclipse 中运行也无法添加运行侦听器。

      【讨论】:

        猜你喜欢
        • 2011-06-25
        • 2012-12-25
        • 1970-01-01
        • 2011-11-10
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        相关资源
        最近更新 更多