Java 定制注解聚合多个注解

2022-09-02 04:26:07

我为我写一个
对于每个我都使用以下注释TestCasesRestControllersControllerTest calss

@WebAppConfiguration
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, TestAppConfig.class})

所以,我决定定义我自己的注释女巫包含所有这些注释,就像这样

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@WebAppConfiguration
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, TestAppConfig.class})
public @interface ControllerTest {
}

然后,我只对我的所有注释使用了一个注释ControllerTest classes

@ControllerTest
public class XXControllerTest {
}

在此修改后,测试失败

java.lang.IllegalArgumentException: WebApplicationContext is required
    at org.springframework.util.Assert.notNull(Assert.java:115)

为了让它再次工作,它需要我添加到@RunWith(SpringJUnit4ClassRunner.class)Test class

@ControllerTest
@RunWith(SpringJUnit4ClassRunner.class)
public class XXControllerTest {
}

我的问题是为什么我的注释在包含注释时不起作用?注释有什么特别之处吗?还是我错过了什么?@ControllerTest@RunWith(SpringJUnit4ClassRunner.class)@RunWith

PS:我使用相同的方法,它们工作得很好。Spring config classes


答案 1

在这种机制中,您可以拥有“元注释”,这些注释本身与其他注释一起注释,然后应用于您放置元注释的类,这是Spring Framework特有的。它不是 Java 注释的标准功能。

它不起作用,因为JUnit不了解这种机制。该注释是 JUnit 注释。JUnit 不明白它应该查看元注释上的注释。@RunWith@ControllerTest

因此,此机制适用于由 Spring 处理的注释,但不适用于由其他工具(如 JUnit)处理的注释。


答案 2

从弹簧注释创建元注释是弹簧功能,并且是 JUnit 注释。@RunWith


推荐