Minutest允许即时生成JUnit 5 DynamicTest。我希望能够导航到在IDE中单击测试时生成测试的代码。
documentation给出了可用于此目的的URI的示例。我在测试定义时所拥有的只是一个StackTraceElement。
如何使用堆栈跟踪元素中的信息来构造合适的URI?
答案 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。