我想创建一个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 {
...
}
答案 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)
时中断构建。
您甚至可以将两种方法结合起来。
希望有帮助!