Java 将有关测试的附加信息从JUnit Runner传递给RunListener

Java 将有关测试的附加信息从JUnit Runner传递给RunListener,java,junit,junit4,junit-runner,Java,Junit,Junit4,Junit Runner,我正在实现一个定制的JUnit Runner,并希望为其添加额外的报告功能。我还希望尽可能多地重用现有的JUnit基础设施,因此实现RunListener听起来是个好主意。RunListener的方法要么采用描述,要么采用失败,两者都没有明显的方法来添加关于测试用例的附加信息 描述实际上是最终的,因为它没有公共构造函数,所以不可能重写它。有一个私有的uniqueId字段可能会通过反射被误用,但这真的很有问题 一个稍微不太老练的变体可能是为我需要的所有信息定义注释,并将此注释的实现附加到描述中。有

我正在实现一个定制的JUnit Runner,并希望为其添加额外的报告功能。我还希望尽可能多地重用现有的JUnit基础设施,因此实现RunListener听起来是个好主意。RunListener的方法要么采用描述,要么采用失败,两者都没有明显的方法来添加关于测试用例的附加信息

描述实际上是最终的,因为它没有公共构造函数,所以不可能重写它。有一个私有的uniqueId字段可能会通过反射被误用,但这真的很有问题

一个稍微不太老练的变体可能是为我需要的所有信息定义注释,并将此注释的实现附加到描述中。有没有人做过类似的事情,或者有没有推荐的方法来处理

以下是我目前正在尝试的一个示例:

public @interface StepMetadata {
    int lineNumber();
    String keyword();
    String title();
}

public class StepMetadataImpl implements StepMetadata {
    private final int lineNumber;
    private final String keyword;
    private final String title;

    // constructor and accessor methods

    @Override
    public Class<? extends Annotation> annotationType() {
        return StepMetadata.class;
    }
}


// inside the Runner
Description.createTestDescription(className, stepTitle, new StepMetadataImpl(...))

// inside the RunListener
StepMetadata step = description.getAnnotation(StepMetadata.class)

相关的问题,编写注释接口的实现有什么缺点吗?

当然建议注释就是为了这个目的:注释-测试的元数据,用于下游的解释器。不过,我对你的实际问题有点不清楚——你试过这个但失败了吗?你不确定这是否是正确的方法吗?@Duncan:谢谢,如果我的底层测试不是实际的java方法,并且我必须自己创建注释,那么我不确定这是否是正确的方法。我没有遇到太多使用这个鲜为人知的特性的代码。正确地做这件事似乎有点复杂,因为我找到了之前关于AnnotationLiteral的答案: