Как я могу создать JSnit 5 DynamicTest testSourceUri из StackTraceElement? - PullRequest
1 голос
/ 10 ноября 2019

Minutest позволяет оперативно генерировать JUnit 5 DynamicTests. Я хотел бы иметь возможность перейти к коду, в котором генерируется тест при щелчке по тесту в IDE.

В документации приведены примеры URI, которые можно использовать для этой цели. ,Все, что у меня есть в момент определения теста, это StackTraceElement .

Как я могу использовать информацию в элементе трассировки стека для создания подходящего URI?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Я думаю, что лучшее, что вы можете сделать, это нацелиться на MethodSource по шаблону URI

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

Однако это приведет вас только к методу теста, который в случае Minutest не является оптимальным.

Это IMO - проблема Java, языка, а не JUnit 5, платформы. У Java нет способа получить местоположение кода (через отражение) более точно, чем указание на метод. Единственным исключением является исключение (каламбур). Трассировка стека исключения может указывать на точное положение в методе. Вот почему - в случае ошибочного утверждения - большинство IDE позволяют вам перейти к линии, в которой возникла ошибка теста.

В редких случаях, таких как у вас, когда у вас есть элемент трассировки стека, доступный во время определения теста,JUnit может представить что-то вроде FileLocationSource и надеяться, что поставщики IDE подберут его - хотя они и не взяли другие вещи из API JUnit 5, которые присутствовали некоторое время. Вы можете подумать о создании проблемы с github для JUnit 5, чтобы убедить их.

0 голосов
/ 11 ноября 2019

В итоге я создал файловый 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)
}

При условии sourceRoot, равном src/test/java, получается URI, которому IntelliJ может следовать, когда тест удваивается. -clicked.

...