2012-11-08 91 views
2

我编写了一个自定义JUnit运行器,我希望成为eclipse插件的一部分,该插件将使用此运行器启动测试,而不必将@RunWith注释应用于班上。我使用org.eclipse.debug.ui.launchShortcuts扩展点设法在'Run As'上下文菜单下获得了一个额外的项目。但是,我不确定如何使用我的自定义亚军来调用测试。使用自定义JUnit运行器实现从eclipse插件启动JUnit测试

+0

请问我的答案'Eclipse如何实际运行测试'http://stackoverflow.com/a/7896628/1836帮助? –

+1

我曾看过那篇文章,这是什么让我这么远。我已经能够通过实现ITestReference,使用internal_kind扩展点以及解开一堆内部类来获得它的工作。但是,这似乎比它应该更复杂!为什么RemoteTestRunner只有一个参数来指定junit亚军!? – ekj

回答

3

所以我想出了一个办法去做我想要的。但是,它看起来有点冒险。但是,我认为我会在这里发布答案,以防其他人遇到同样的问题。

首先,你必须注册一个JUnit一种这样的:

<extension point="org.eclipse.jdt.junit.internal_testKinds"> 
     <kind 
      id="my.junit.kind" 
      displayName="Your Kind Name" 
      finderClass="org.eclipse.jdt.internal.junit.launcher.JUnit4TestFinder" 
      loaderPluginId="org.eclipse.jdt.junit4.runtime" 
      loaderClass="your.test.loader.MyLoaderClass"> 
     <runtimeClasspathEntry pluginId="org.eclipse.jdt.junit4.runtime" /> 
     <runtimeClasspathEntry pluginId="org.eclipse.jdt.junit.core" />   
     <runtimeClasspathEntry pluginId="org.eclipse.jdt.junit.runtime"/>  
     </kind> 
    </extension> 

在XML必须指定的org.eclipse.jdt.internal.junit.runner.ITestLoader自定义实现这反过来又返回org.eclipse.jdt.internal.junit.runner.ITestReference的实现。核心部分是ITestReference的实现,因为这是您创建自定义JUnit运行器实例的地方。

public class MyTestReference extends JUnit4TestReference 
    { 

     public MyTestReference(final Class<?> p_clazz, String[] p_failureNames) 
     { 
     super(new Request() 
     { 
      @Override 
      public Runner getRunner() 
      { 
       return new MyCustomRunner(p_clazz); 
      } 

     }, p_failureNames); 
     } 
... 
} 

然后最后你有一个启动快捷键设置的那种适当

public class MyJunitLaunchShortcut extends JUnitLaunchShortcut 
{ 
    @Override 
    protected ILaunchConfigurationWorkingCopy createLaunchConfiguration(IJavaElement p_element) throws CoreException 
    { 
     ILaunchConfigurationWorkingCopy config = super.createLaunchConfiguration(p_element); 
     config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND, "my.junit.kind"); 
     return config; 
    } 
} 

这确实使用了一堆内部类的链接这一点,所以有可能是一个更好的办法。但是,这似乎工作。

相关问题