2013-05-17 53 views
0

我有一个生产者类,注解@Singleton,其中包含一个注解为@Produces的方法。焊接CDI:使用@Alternative @Singleton

我想用这种方法的替代方法编写单元测试,但无法做到这一点。这里是我的代码摘要:

package fr.easycompany.easywrite.tools.injection; 

@Singleton 
public class Producers { 
    @Produces @Named(PREFERENCES_FILE_NAMED) 
    public String producePreferenceFileName(){ 
     return "preferences.xml"; 
    } 
} 

而我的另一种方法:

package fr.easycompany.easywrite.tools.injection; 

@Singleton 
@Alternative 
public class ProducersAlternative { 
    @Produces @Named(PREFERENCES_FILE_NAMED) 
    public String producePreferenceFileName(){ 
     return "preferences_test.xml"; 
    } 
} 

我还创建了一个beans.xml文件放在src /测试/资源/ META-INF,内容如下

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:weld="http://jboss.org/schema/weld/beans" 
     xsi:schemaLocation=" 
      http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd 
      http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd"> 
    <alternatives> 
     <class>fr.easycompany.easywrite.tools.injection.ProducersAlternative</class> 
     </alternatives> 
</beans> 

执行时,总是调用Producers#producePreferenceFileName()。为什么不是ProducersAlternative的方法?是不可能有一个单身注入类的替代品?

+0

我试过你的代码,它工作正常。 ProducersAlternative#producePreferenceFileName()按预期调用。 –

回答

2

我不认为这与单身人士有任何关系。注解@Alternative不是用于Producer类,而是用于bean的替代实现。您可以使用替代原型,并注释替代生产者方法,以完成此工作。这是必要的,因为具有@Alternative注释的方法无法在beams.xml中启用 - 但是可以使用刻板标记(另请参阅this discussion on JBoss forum)。要做到这一点,你必须创建一个像这样的刻板印象:

@RequestScoped 
@Stereotype 
@Retention(RetentionPolicy.RUNTIME) 
@Alternative 
@Target({ 
    ElementType.TYPE, ElementType.METHOD 
}) 
public @interface Staging {} 

你必须使你的beans.xml这种替代刻板印象(而不是声明你的替代生产商类有)这样的:

<alternatives> 
    <stereotype>full.qualified.path.to.Staging</stereotype> 
</alternatives> 

然后,您可以标注您的替代生产者方法(最好删除您制作类,并在beans.xml中的@Alternative注释):

@Singleton 
public class ProducersAlternative { 
    @Produces @Named(PREFERENCES_FILE_NAMED) @Staging 
    public String producePreferenceFileName(){ 
     return "preferences_test.xml"; 
    } 
} 

希望这有助于:-)

+0

由于未知原因,我必须删除@RequestScoped才能使其正常工作。留下它会引发** UnproxyableResolutionException ** –

+1

注释@Alternative在生产者类上正常工作。例如,请参阅您关联的讨论。应用于方法时它不起作用。 –