8

我为 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 以在那里看到相同的输出。

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

4

3 回答 3

2

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

从 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 执行项目的所有测试,并保证您将在执行所有测试之前或之后执行一段代码。

于 2014-10-03T08:20:10.897 回答
1

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

于 2014-11-21T21:41:06.383 回答
0

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

于 2012-07-05T11:53:00.823 回答