Java自定义注释聚合多个注释
问题内容:
我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
,它们也很好用。
问题答案:
这种机制是Spring框架特有的,在这种机制中,您可以使用本身带有其他注释的“元注释”,然后将其应用到放置元注释的类。它不是Java注释的标准功能。
它不起作用,因为JUnit不了解此机制。该@RunWith
注释是一个JUnit注释。JUnit不了解它应该查看您的@ControllerTest
元注释上的注释。
因此,此机制适用于Spring处理的注释,而不适用于其他工具(如JUnit)处理的注释。