Java自定义Annotation聚合多个注释

我正在为我的RestControllers编写一个TestCases
对于每个ControllerTest 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(SpringJUnit4ClassRunner.class)@RunWith注释有什么特别之处吗? 还是我错过了什么?

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

这种机制,你可以在其中使用其他注释注释的“元注释”,然后将其应用于放置元注释的类,这是Spring Framework特有的。 它不是Java注释的标准function。

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

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

从spring注释创建元注释是一个弹簧特征,而@RunWith是一个JUnit注释。