1

我正在编写一个测试执行监听器。Junit5 框架的一个小扩展。有必要知道在运行具有TestIdentifier和的特定测试时使用的是什么类TestPlan

((MethodSource) id.getSource().get()).getClassName(); 

仅给出声明测试的类。但是,这并不意味着它是从声明的类中运行的。

例如,可以从子类运行测试。

Can 的解析结果TestIdentifier#getUniqueId() 因情况而异(junit4 的单一测试,junit5 的单一测试,junit5 的动态测试,junit4 的参数化测试等)

此刻我没有发现任何可能这样做。

有没有可靠的方法来获得执行测试的类?

4

2 回答 2

2

TestPlan保存对in的引用testPlanExecutionStarted并使用 . 检查父TestSource级的. 如果是,您可以访问via 。TestIdentifiertestPlan.getParent(testIdentifier)ClassSourceClassclassSource.getJavaClass()

于 2017-03-14T11:34:32.610 回答
1

我找到了描述情况的临时解决方案。这个想法是遍历所有父母并首先找到包含 ClassSources,然后使用该 ClassSource。

private static String findTestMethodClassName(TestPlan testPlan, TestIdentifier identifier) {
    identifier.getSource().orElseThrow(IllegalStateException::new);
    identifier.getSource().ifPresent(source -> {
        if (!(source instanceof MethodSource)) {
            throw new IllegalStateException("identifier must contain MethodSource");
        }
    });


    TestIdentifier current = identifier;
    while (current != null) {
        if (current.getSource().isPresent() && current.getSource().get() instanceof ClassSource) {
            return ((ClassSource) current.getSource().get()).getClassName();
        }
        current = testPlan.getParent(current).orElse(null);
    }
    throw new IllegalStateException("Class name not found");
}

尽管该解决方案满足了我的需求,但它不能保证框架行为将来不会改变,并且目前不能被认为是可靠的。

该问题已发布到https://github.com/junit-team/junit5/issues/737

于 2017-03-15T11:13:42.450 回答