java - 如何创建只能应用于测试方法而不是整个测试类的 JUnit5 自定义扩展

标签 java junit5

我想创建一个 JUnit5 扩展来解析测试方法参数,实现 ParameterResolver :

public class MyParameterResolver implements ParameterResolver {

    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        ...
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        ...
    }
}

该扩展仅在测试方法之上使用:

public class DemoTest {

    @Test
    @ExtendWith(MyParameterResolver.class)
    public void test(int x, int y) {
        ...
    }

    @Test
    @ExtendWith(MyParameterResolver.class)
    public void test2(int x, int y) {
        ...
    }
} 

如何防止它在测试类之上使用(如果可能的话最好在编译时使用,但运行时也很好)?

//I don't want this to work
@ExtendWith(MyParameterResolver.class)
public class DemoTest {
    ...
} 

最佳答案

在编译时检查:

如果你查看@ExtendWith源代码,你会发现它是一个复合注释,并且有一个@Target({ElementType.TYPE, ElementType.METHOD})。如果这只是 @ElementType.METHOD,它将完全按照您的要求执行,并且不允许在类上使用 @ExtendWith

但是,更改@ExtendWith并不是一个好的选择 - 您不拥有它,并且您希望能够在任何地方使用它:)

可以做的是创建自己的复合注释:

@Target(value = {ElementType.METHOD})
@ExtendWith(MyParameterResolver.class)
public @interface MyParameterResolverAnnotation {
}

您现在可以使用它来代替 @ExtendWith(MyParameterResolver.class),并且如果放在类上,它将不会编译。

我想不出另一种方法来防止在编译时发生这种情况。

在运行时/构建时,您有更多选项,例如设置自定义检查样式规则,如果在类上找到 @ExtendWith(MyParameterResolver.class),该规则将中断构建。

您甚至可以结合使用这两种方法。

希望有帮助!

关于java - 如何创建只能应用于测试方法而不是整个测试类的 JUnit5 自定义扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55493606/

相关文章:

java - 如何在android中查找动态UI元素的ID

java - Hibernate:选择对象关系映射?

java - 如何查看使用 Ant junitlauncher 和 junitreport 任务运行 junit5 测试期间生成的所有 log4j2 输出?

Jenkins :没有一份测试报告包含任何结果

java - 未找到测试 - 使用 JUnit5 时 [在 IntelliJ IDEA 中]

java - 泛型方法的子类实现

java - Tomcat 上部署的 Web 应用程序出现 NoClassDefFound 错误

java - HashMap 中可以发生多少次重新哈希

gradle - JUnit 5并行测试执行会丢失测试的输出

java - 设置 "Jupiter API artifact"是什么意思?