2013-05-17 4 views
0

У меня есть класс Продюсеров, аннотированный @Singleton, содержащий метод, аннотированный @Produces.Weld 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

Я пробовал ваш код, и он отлично работает. ПроизводителиАлтернативный # productPreferenceFileName() вызывается как ожидалось. –

ответ

2

Я не думаю, что это имеет какое-либо отношение к Singletons. Аннотации @Alternative просто не предназначены для использования в классах Producer, а в альтернативной реализации компонента. Вы можете использовать альтернативный стереотип и вместо этого добавить альтернативный метод производителя, чтобы сделать эту работу. Это необходимо, потому что методы, которые @Alternative annotation не могут быть включены в 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> 

вы можете аннотировать альтернативный метод производителя (лучше вы удалите @Alternative аннотации на классе производителя и в beans.xml):

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

Надеются, что это помогает :-)

+0

По неизвестной причине мне пришлось удалить @RequestScoped, чтобы он работал. Оставляя это, вызывает ** UnproxyableResolutionException ** –

+1

Аннотации @Alternative отлично работают на классах Producer. См. Например, обсуждение, с которым вы связались. Это просто не работает при применении к методам. –

Смежные вопросы