簡體   English   中英

Java自定義Annotation聚合多個注釋

[英]Java custom Annotation aggregate multiple annotations

我正在為我的RestControllers編寫一個TestCases
對於每個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(SpringJUnit4ClassRunner.class) @RunWith注釋有什么特別之處嗎? 還是我錯過了什么?

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

這種機制,你可以在其中使用其他注釋注釋的“元注釋”,然后將其應用於放置元注釋的類,這是Spring Framework特有的。 它不是Java注釋的標准功能。

它不起作用,因為JUnit不理解這種機制。 @RunWith注釋是一個JUnit注釋。 JUnit不明白它應該查看@ControllerTest元注釋上的注釋。

因此,此機制適用於由Spring處理的注釋,但不適用於由其他工具(如JUnit)處理的注釋。

從spring注釋創建注釋是一個彈簧特征,而@RunWith是一個JUnit注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM