2010-11-05 44 views
1

使用AspectJ,如何替換現有註釋?AspectJ:如何替換現有註釋

我有以下代碼

declare @method : @Test * *(..) : @Test(timeout=10); 

這對每個測試方法生成以下錯誤:

... already has an annotation of type org.junit.Test, cannot add a second 
instance [Xlint:elementAlreadyAnnotated] 

當然,錯誤是有道理的,但什麼是說,語法「中刪除@Test註釋有所有的方法,然後用@Test(timeout=10)

回答

4

我是AspectJ項目負責人。在https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026我們正在研究如何使用申報註釋:

  • 加強現有的註解(增加值,那些已經存在)
  • 替換它們
  • 定義優先級(應您的聲明取代還有什麼?)

我們也在尋找它的形式,消除註釋:

聲明@remove_from_method:INT的MyMethod() : @即將被刪除;

但你不能做到這一點尚未...

+0

感謝您的更新。我已經登錄添加了一些關於這個bug的投票。我很喜歡這個功能。感覺創建一個解決方法是一個相當難看的過程。 – gMale 2010-12-20 01:44:58

1

我懷疑你可以用Aspe CTJ。至少我在當前版本的AspectJ in Action中找不到任何相關信息。

什麼你可以做的是旁邊的測試註解注入自己的自定義註釋和編寫自定義的JUnit Runner類(與@RunWith註釋,您可以再次與您方面注入約束),讓您的自定義註解優先通過@Test註釋。

+0

搞笑,這就是同一本書我有我的辦公桌上開放,現在。大聲笑。我喜歡你要去的地方。我已經寫了一些mixin,所以我對使類完成不同的事情(比如擴展其他東西)感到有點舒服。儘管你的建議有一個問題:我的測試類已經使用了@RunWith註解。我想知道如果我做所有測試擴展一個使用自定義@RunWith的父類,如果這可以工作,正如你所提到的 – gMale 2010-11-05 14:02:47

+0

父類方法將工作('@ RunWith'標記爲'@ Inherited'),但如果孩子類包含註釋,子註釋勝過父註釋。 – 2010-11-05 14:09:32