如何从StackTraceElement创建JUnit 5 DynamicTest testSourceUri?

时间:2019-11-10 11:13:47

标签: junit5

Minutest允许即时生成JUnit 5 DynamicTest。我希望能够导航到在IDE中单击测试时生成测试的代码。

documentation给出了可用于此目的的URI的示例。我在测试定义时所拥有的只是一个StackTraceElement

如何使用堆栈跟踪元素中的信息来构造合适的URI?

2 个答案:

答案 0 :(得分:1)

我认为您能做的最好的就是沿着URI模式定位MethodSource

method:org.junit.Foo#bar(java.lang.String, java.lang.String[])

但是,这只会带您进入测试方法,在Minutest的情况下,这并不是最佳选择。

这是IMO的问题,而不是JUnit 5(平台)的Java语言。 Java没有比指向方法更准确地获得代码位置(通过反射)的方法。一个例外是例外(双关语是故意的)。异常的堆栈跟踪可以指向方法中的确切位置。这就是为什么-在断言失败的情况下-大多数IDE允许您导航到测试失败的起点。

在像您这样的极少数情况下,您在测试定义时就有可用的堆栈跟踪元素,JUnit可能会引入类似FileLocationSource之类的东西,并希望IDE供应商能够使用它-尽管他们没有选择。 JUnit 5的API中已有的其他内容已经存在了一段时间。您可能会考虑为JUnit 5创建一个github问题,以说服他们。

答案 1 :(得分:0)

我最终通过猜测源的位置来创建文件URI。

private fun StackTraceElement.toSourceFileURI(sourceRoot: File): URI? {
    val fileName = fileName ?: return null
    val type = Class.forName(className)
    val fileUri = sourceRoot.toPath().resolve(type.`package`.name.replace(".", "/")).resolve(fileName).toUri()
    return URI(fileUri.scheme, fileUri.userInfo, fileUri.host, fileUri.port, "//" + fileUri.path, "line=$lineNumber", fileUri.fragment)
}

给定src/test/java的sourceRoot,它会生成一个URI,双击测试,IntelliJ可以遵循该URI。