我正在编写一个测试执行监听器。 Junit5框架的一点扩展。运行具有JRE7
和TestIdentifier
的特定测试时,有必要知道使用了哪个类。
TestPlan
仅提供测试声明的课程。 但是,这并不意味着它是从声明的类中运行的。
例如,可以从子类运行测试。
解析((MethodSource) id.getSource().get()).getClassName();
的结果
可以根据具体情况而有所不同
(junit4单次测试,junit5单次测试,junit5动态测试,junit4参数化测试等)
此刻我没有发现任何可能性。
有没有可靠的方法来获得执行测试的类?
答案 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