在 JUnit 5 中,您可以定义自己的测试模板并将其绑定(bind)到注释。 现在我可以使用我自己的测试注释 @MyTest(...) 而不是 @Test 或 @ParameterizedTest
问题是 Intellij 无法将此注释识别为 JUnit 测试注释,因此无法为我提供运行/调试此测试的选项。
我可以扩展这个注释列表来告诉 IntelliJ 这是一个测试吗?
左图是一个标准测试,其中上下文显示了一个运行函数。 右图显示了我的模板,该模板运行良好,只是上下文无法将其识别为测试。
我的测试模板如下所示:
@Target(
AnnotationTarget.ANNOTATION_CLASS,
AnnotationTarget.FUNCTION
)
@Retention(AnnotationRetention.RUNTIME)
@Execution(ExecutionMode.CONCURRENT)
@TestTemplate
@ExtendWith(ScTestExtension::class)
annotation class ScTest(
// ... some properties
)
class ScTestExtension : TestTemplateInvocationContextProvider {
override fun supportsTestTemplate(context: ExtensionContext): Boolean {
return true
}
override fun provideTestTemplateInvocationContexts(extensionContext: ExtensionContext): Stream<TestTemplateInvocationContext> {
// ... return invocation context
}
}
最佳答案
您的 ScTest.java
应该与此类似:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Test;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
public @interface ScTest {}
源自 https://junit.org/junit5/docs/current/user-guide/#writing-tests-meta-annotations
IIRC、IDEA 和其他 IDE 查找 Testable 的实例显示“运行...”图标。但通常情况下,您不应该直接使用该注释。使用 @Test
、@TestTemplate
或 friend 对其进行元注释就足够了。
这是另一个使用 @TestTemplate
的示例(至少在两年前):CartesianProductTest.java
@TestTemplate
@ExtendWith(CartesianProductProvider.class)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CartesianProductTest {...}
以下是“IntelliJ IDEA 2019.3 EAP(社区版)构建#IC-193.4386.10,构建于 2019 年 10 月 9 日” 显示当前 @CartesianProductTest
注释的用法:
也许您需要切换到深色模式...
关于java - JUnit TestTemplates 的 IntelliJ 运行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306297/