本文介绍了Java自定义Annotation聚合多个注解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的 RestControllers
编写一个 TestCases对于每个 ControllerTest calss 我使用以下注释

Im writing a TestCases for my RestControllers
For each ControllerTest calss I use the following annotations

@WebAppConfiguration
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, TestAppConfig.class})

所以,我决定定义自己的注释,包含所有这样的注释

So, I decided to define my own annotation witch contain all those annotations like this

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@WebAppConfiguration
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, TestAppConfig.class})
public @interface ControllerTest {
}

然后,我对所有 ControllerTest 类

@ControllerTest
public class XXControllerTest {
}

修改后测试失败

java.lang.IllegalArgumentException: WebApplicationContext is required
    at org.springframework.util.Assert.notNull(Assert.java:115)

为了让它再次工作,我需要将 @RunWith(SpringJUnit4ClassRunner.class) 添加到 Test 类

And to make it work again it required me to add the @RunWith(SpringJUnit4ClassRunner.class) to the Test class

@ControllerTest
@RunWith(SpringJUnit4ClassRunner.class)
public class XXControllerTest {
}

我的问题是为什么我的 @ControllerTest 注释在包含 @RunWith(SpringJUnit4ClassRunner.class) 注释时不起作用?@RunWith 注释有什么特别之处吗?还是我错过了什么?

My question is why my @ControllerTest annotation doesn't work while its contain the @RunWith(SpringJUnit4ClassRunner.class) annotation? is there anything special about the @RunWith annotation? or did I miss something?

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

PS: I use the same approach for Spring config classes and they work just fine.

推荐答案

这种机制,你可以有元注释",这些元注释"本身是用其他注释注释的,然后应用于你放置元注释的类注释,是特定于 Spring 框架的东西.它不是 Java 注释的标准特性.

This mechanism, where you can have "meta-annotations" that are themselves annotated with other annotations, which then apply to the class on which you put your meta-annotation, is something that is specific to the Spring Framework. It is not a standard feature of Java annotations.

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

It doesn't work because JUnit does not understand this mechanism. The @RunWith annotation is a JUnit annotation. JUnit does not understand that it should look at the annotations that are on your @ControllerTest meta-annotation.

因此,这种机制适用于 Spring 处理的注解,但不适用于 JUnit 等其他工具处理的注解.

So, this mechanism works with annotations that are processed by Spring, but not with annotations that are processed by other tools such as JUnit.

这篇关于Java自定义Annotation聚合多个注解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 09:06
查看更多