java - JUnit TestTemplates 的 IntelliJ 运行上下文

标签 java intellij-idea junit junit5

在 JUnit 5 中,您可以定义自己的测试模板并将其绑定(bind)到注释。 现在我可以使用我自己的测试注释 @MyTest(...) 而不是 @Test 或 @ParameterizedTest

问题是 Intellij 无法将此注释识别为 JUnit 测试注释,因此无法为我提供运行/调试此测试的选项。

我可以扩展这个注释列表来告诉 IntelliJ 这是一个测试吗?

左图是一个标准测试,其中上下文显示了一个运行函数。 右图显示了我的模板,该模板运行良好,只是上下文无法将其识别为测试。

with context context not recognized

我的测试模板如下所示:

@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 注释的用法:

enter image description here

也许您需要切换到深色模式...

关于java - JUnit TestTemplates 的 IntelliJ 运行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306297/

相关文章:

java - 可选字段的 Avro 序列化

java - Liferay 7 hibernate方言不兼容问题

intellij-idea - 如何在 IntelliJ IDEA 中为模块使用不同的代码样式?

scala - 每次与存储库同步后,IntelliJ 都会不断询问 "Setup Scala SDK"

java - Hibernate ConfigurationException : Could not locate cfg. xml 资源 [hibernate.cfg.xml] IntelliJ

java - 如何在 Java 8 中填充 map ?

java - Java多线程环境下访问数据库

java - Junit 在等待并处理异常后断言某些内容

Java 临时文件夹 getRoot() 异常

java - for 循环内 if 条件的 Junit 测试用例