Java JUnit测试模板的IntelliJ运行上下文

Java JUnit测试模板的IntelliJ运行上下文,java,intellij-idea,junit,junit5,Java,Intellij Idea,Junit,Junit5,在JUnit5中,您可以定义自己的测试模板并将其绑定到注释。 现在我可以使用自己的测试注释@MyTest(…),而不是@Test或@ParameterizedTest 问题是Intellij没有将此注释识别为JUnit测试注释,因此没有给我运行/调试此测试的选项 我可以扩展这个注释列表来告诉IntelliJ这是一个测试吗 左边的图片是一个标准测试,上下文显示一个运行函数。 右边的图片显示了我的模板,它工作得很好,只是上下文没有将其识别为测试 我的测试模板如下所示: @Target(

在JUnit5中,您可以定义自己的测试模板并将其绑定到注释。 现在我可以使用自己的测试注释@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
    }
}
@Target(
AnnotationTarget.ANNOTATION_类,
AnnotationTarget.FUNCTION
)
@保留(AnnotationRetention.RUNTIME)
@执行(ExecutionMode.CONCURRENT)
@测试模板
@ExtendWith(ScTestExtension::类)
注释类ScTest(
//…一些属性
)
类ScTestExtension:TestTemplateInvocationContextProvider{
重写fun supportsTestTemplate(上下文:ExtensionContext):布尔值{
返回真值
}
override fun ProvideTestTemplateInvocationContext(extensionContext:extensionContext):流{
//…返回调用上下文
}
}

您的
ScTest.java
应该与此类似:

import java.lang.annotation.ElementType;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
导入java.lang.annotation.Target;
导入org.junit.jupiter.api.Test;
@目标(ElementType.METHOD)
@保留(RetentionPolicy.RUNTIME)
@试验
public@interface ScTest{}
源自

IIRC、IDEA和其他IDE查找的实例显示“Run…”图标。但通常情况下,不应该直接使用该注释。用
@Test
@TestTemplate
或friends对其进行元注释就足够了

下面是另一个使用
@TestTemplate
的示例,至少在两年前有效:

@TestTemplate
@ExtendWith(CartesianProductProvider.class)
@目标(ElementType.METHOD)
@保留(RetentionPolicy.RUNTIME)
public@interface CartesianProductTest{…}
以下是“IntelliJ IDEA 2019.3 EAP(社区版)构建#IC-193.4386.10,于2019年10月9日构建”如何展示当今
@CartesianProductTest
注释的用法:


也许您需要切换到暗模式…

您是否用
@Retention(RetentionPolicy.RUNTIME)注释了
ScTest
?您是否使用
@Test
@parameteriedtest
注释了
ScTest
?@Sormuras是的,保留策略设置为运行时,并使用测试或其他已知注释进行注释,但它没有解决问题。您可以共享更多代码吗?这可能是一个最小的无效示例?谢谢@Sormuras,我的代码与本例中的代码几乎相同。我唯一开始怀疑的是,我使用的是Kotlin而不是java。你有Kotlin的例子吗?我现在的解决方法是在测试中添加@TestTemplate。这样它就会突出显示。但我们可以做得更好