2012-11-05 114 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。