Java自定义Annotation聚合多个注释

时间:2015-10-26 12:18:52

标签: java spring unit-testing annotations

我为TestCases写了一个RestControllers 对于每个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注释有什么特别之处吗?还是我错过了什么?

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

2 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:2)

从弹簧注释中创建meta-annotations是一个弹簧特征,@RunWith是一个JUnit注释。