2013-05-17 84 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在生產者類上正常工作。例如,請參閱您關聯的討論。應用於方法時它不起作用。 –