问题 Java自定义Annotation聚合多个注释


我正在写一个 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 他们工作得很好。


4315
2017-10-26 12:18


起源



答案:


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

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

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


11
2017-10-26 12:30





创建 元注释 弹簧注释是一个弹簧特征和 @RunWith 是一个JUnit注释。


2
2017-10-26 12:34