我为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,以便在运行测试时看到相同的输出。
这可能吗?出于测试目的并保持一致,最好有相同的输出。
答案 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运行监听程序。