2012-11-05 141 views
0

這是我第一次創建Annotation Java,我想創建一個自己的註釋,然後在必要時禁止執行測試。 問題是,我的許多測試我不得不使用Facebook API,有時他們不工作,所以我想要一個名爲@Facebook的註釋,當添加到測試中時,它作爲@Suppress註釋工作,所以我編寫了下面的代碼。 ..不幸的是不工作。任何人都可以幫助我?創建我自己的註釋Java

 @Retention(RetentionPolicy.RUNTIME) 
     public @interface Facebook { 
      Suppress notToBeRun() default @Suppress; 
     } 
+1

不是你要求的,但假設你想要的是禁用JUnit測試,爲什麼不使用@Ignore? – haylem

+0

只需要一個簡單的方法來再次找到標記爲Facebook廣告的所有測試:) – Shilaghae

+0

然後,您可以使用:@Ignore(「Facebook」)或者@Ignore(Reason.FACEBOOK),其中Reason是枚舉。 – Puce

回答

0

Java包含一個靈活的註釋API,其中包含許多應用程序可能性。首先開發用於指定Java EE堆棧中的企業語義(無論Java bean是無狀態還是有狀態,單例等),現在註釋接口也已經在Java中用於上下文相關注入(CDI)。您的問題解決了如何使用CDI的Java註釋API。

首先,您需要爲每個想要Java注入的特定用戶定義的CDI選項定義一個限定符接口類。你想通過注入來加載Facebook的實現。你的界面(Facebook.java)可以如下所示:

@Qualifier 
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Facebook { 
} 

中的第一項,@Qualifier表明您定義一個新的限定詞,實際上是由Java的注射機構已知的唯一名稱(@Facebook)。

@Target註釋表示您的註釋可以在Java類型聲明,Java字段(特別是變量聲明)或方法參數之前。您可以添加第四個限定符,以允許您的註釋也可以在方法之前使用,即ElementType.METHOD

@Documented定義了一個註釋,確保使用此註釋的類在其生成的JavaDoc中顯示此註釋。 @Retention必須設置爲RetentionPolicy.RUNTIME,以便當Java應用程序啓動時(在Web應用程序服務器上下文中部署)註釋變爲活動狀態。

現在,您需要定義一個通用的Java接口類(SocialMediaService.java),只是一個普通的Java接口:

public interface SocialMediaService { 
    boolean login(String userId, String password); 
    void logout(); 
    String searchForMessages(String[] friends); 
} 

這個接口可以通過不同的方式來實現,由implements的Java方法-構造。 使用先前定義的註釋,您可以在Java代碼中選擇 要使用的替代實現。

這裏是一個Java的類的實-示例(Facebook.java,在不同包大於接口限定符類,上面指定的):

@Facebook 
public class Facebook implements SocialMediaService { 

    @Override 
    public boolean login(String userId, String password) { 
     ... 
     your application logic 
     ... 
     return true; 
    } 
    @Override 
    public void logout() { 
     ... 
     your application logic 
     ... 
    } 
    @Override 
    public String searchForMessages(String[] friends) { 
     ... 
     your application logic 
     ... 
     return searchResult; 
    } 
} 

可以在衆多的選擇不同的實現@LinkedIn等,每個實現都具有它們特定的Java實現類(public class Facebook的替代)。

在你的Java類中,你現在已經準備好使用CDI來注入選擇的Java實現。

後端Java bean(BackendSocialMediaAnalysis。其中被施加CDI的java):

public class BackendSocialMediaAnalysis { 
    ... 
    @Inject @Facebook 
    private SocialMediaService genericMediaService; 
    ... 
} 

在替代方案中更換@Facebook@LinkedIn結果(LinkedIn)執行被加載到genericMediaService。