0

我有一个用 注释的 Producers 类@Singleton,其中包含一个用 注释的方法@Produces

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

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";
    }
}

我还在 src/test/resources/META-INF 中创建了一个 beans.xml,内容如下

<?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方法?是否不可能有单例注入类的替代方案?

4

1 回答 1

2

我不认为这与单身人士有任何关系。注释 @Alternative 并不打算用于生产者类,而是用于 bean 的替代实现。您可以使用替代构造型并注释您的替代生产者方法来代替使其工作。这是必需的,因为无法在 beams.xml 中启用具有 @Alternative 注释的方法 - 但可以使用构造型(另请参阅JBoss 论坛上的此讨论)。为此,您必须创建一个像这样的刻板印象:

@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";
  }
}

希望这可以帮助 :-)

于 2013-05-17T16:03:13.057 回答