2015-10-26 115 views
10

我写一个TestCasesRestControllers
对于每个ControllerTest calss我用下面的注解Java自定义注释聚集多个注释

@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,他们工作得很好。

回答

7

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

它不工作,因为JUnit不理解这种机制。 @RunWith注释是JUnit注释。 JUnit不理解它应该查看您的@ControllerTest元注释中的注释。

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

2

创建meta-annotations从弹簧注释是弹簧功能和@RunWith是JUnit注释。