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

时间:2017-03-14 08:27:07

标签: java junit5

我正在编写一个测试执行监听器。 Junit5框架的一点扩展。运行具有JRE7TestIdentifier的特定测试时,有必要知道使用了哪个类。

TestPlan

仅提供测试声明的课程。 但是,这并不意味着它是从声明的类中运行的。

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

解析((MethodSource) id.getSource().get()).getClassName(); 的结果 可以根据具体情况而有所不同 (junit4单次测试,junit5单次测试,junit5动态测试,junit4参数化测试等)

此刻我没有发现任何可能性。

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

2 个答案:

答案 0 :(得分:2)

TestPlan中保存对testPlanExecutionStarted的引用,并使用TestSource检查TestIdentifier父母的testPlan.getParent(testIdentifier)。如果是ClassSource,您可以通过Class访问classSource.getJavaClass()

答案 1 :(得分: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");
}

虽然该解决方案满足了我的需求,但并不保证框架行为在未来不会改变,此时也不能被认为是可靠的。

问题已发布到here