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注释。