如何创建仅适用于测试方法而不适用于整个测试类的JUnit5自定义扩展

时间:2019-04-03 11:02:28

标签: 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 {
    ...
} 

1 个答案:

答案 0 :(得分:1)

要在编译时检查:

如果查看@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)时中断构建。

您甚至可以将两种方法结合起来。

希望有帮助!

相关问题