2013-02-12 83 views
0

我尝试编写自己的junit运行程序,目前我被困在返回正确的测试描述。错误的junit测试名称

public class ParameterizedWrapper extends Suite { 
    private List<Runner> fRunners; 

    /** 
    * @throws Throwable 
    * 
    */ 
    public ParameterizedWrapper(final Class<?> clazz) throws Throwable { 
     super(clazz, Collections.<Runner>emptyList()); 
     fRunners = constructRunners(getParametersMethod()); 
    } 

    protected List<Runner> constructRunners(final FrameworkMethod method) throws Exception, Throwable { 
     @SuppressWarnings("unchecked") 
     Iterable<Object[]> parameters = (Iterable<Object[]>) getParametersMethod().invokeExplosively(null); 
     ArrayList<Runner> runners = new ArrayList<Runner>(); 
     int index = 0; 
     for (Object[] parameter : parameters) { 
      Class<?> testClass = getTestClass().getJavaClass(); 
      WrappedRunner wrappedRunner = testClass.getAnnotation(WrappedRunner.class); 
      Runner runner = wrappedRunner.value().getConstructor(Class.class).newInstance(getTestClass().getJavaClass()); 
      runners.add(new WrappingRunner(runner, parameter, testClass, index++)); 
     } 
     return runners; 
    } 

    private FrameworkMethod getParametersMethod() throws Exception { 
     List<FrameworkMethod> methods = getTestClass().getAnnotatedMethods(Parameters.class); 
     for (FrameworkMethod each : methods) { 
      if (each.isStatic() && each.isPublic()) { 
       return each; 
      } 
     } 

     throw new Exception("No public static parameters method on class " + getTestClass().getName()); 
    } 

    @Override 
    protected List<Runner> getChildren() { 
     return fRunners; 
    } 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.TYPE}) 
    public static @interface WrappedRunner { 
     Class<? extends Runner> value(); 
    } 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.METHOD}) 
    public static @interface ParameterSetter { 
    } 

} 

class WrappingRunner extends Runner { 
    private Runner wrappedRunner; 

    private Object[] parameters; 

    private Class<?> testClass; 

    private int testPosition; 

    public WrappingRunner(final Runner runner, final Object[] params, final Class<?> clazz, final int position) { 
     wrappedRunner = runner; 
     parameters = params; 
     testClass = clazz; 
     testPosition = position; 
    } 

    @Override 
    public Description getDescription() { 
     Description originalDescription = wrappedRunner.getDescription(); 
     Description newDescription = Description.createSuiteDescription(nameFor(""), new Annotation[0]); 
     for (Description child : originalDescription.getChildren()) { 
      newDescription.addChild(decorateChildDescription(child)); 
     } 

     return newDescription; 
    } 

    private String nameFor(String name) { 
     return String.format("%1$s[%2$s]", name, testPosition); 
    } 

    protected Description decorateChildDescription(final Description originalChildDescription) { 
     Description d = Description.createTestDescription(originalChildDescription.getTestClass(), 
       nameFor(originalChildDescription.getMethodName()), 
       originalChildDescription.getAnnotations().toArray(new Annotation[0])); 
     return d; 
    } 

    @Override 
    public void run(final RunNotifier notifier) { 
     try { 
      ParameterStorage.storeParameters(testClass, parameters); 
      wrappedRunner.run(notifier); 
     } finally { 
      ParameterStorage.clearParameters(testClass); 
     } 
    } 
} 

我有一些测试类来检查亚军是否工作。亚军工作正常,除了测试命名怪异。在Eclipse中它会显示所有的测试,并增加了无根的测试类别

enter image description here

和神火不使用我的命名都​​:

enter image description here

我相比,我的亚军和Parameterized生成的描述对象亚军,似乎没有区别。

回答

0

我检查了一下,发现我的跑步者生成的描述没问题。但这并不重要,因为它与实际测试执行期间使用的描述不一致。这就是为什么eclipse将条目显示为未执行的原因,这就是为什么surefire不会显示我的名字。

目前我认为要使用我自己的通知程序来抓取测试起点并替换当前的配置。

如果有人有更好的解决方案,我想知道它:)。

1

这是一个有点难看,但它的安全子选手的名单传递给父类的构造:

public ParameterizedWrapper(final Class<?> clazz) throws Throwable { 
    super(clazz, constructRunners(getParametersMethod()); 
} 

private static List<Runner> constructRunners(final FrameworkMethod method) 
    throws Throwable { 
    ... 

你不应该需要重写Suite.getChildren()

+0

咦,我把想法和一些代码从junit Paramterezied亚军 – 2013-02-14 07:05:06