2013-12-20 4 views
1

Использование Arquillian JUnit (версия 1.1.1 соответственно 4.11) для установки моего CDI (1.0.0.CR7 на Weld 1.1.13.Final), встроенного в JDK 1.7.25. ...CDI Наблюдение в Arquillian, событие, не размноженное для инжектируемого компонента

Получили следующие классы:

public class Receiver { 
    private String message; 

    public void catching(@Observes DummyEvent event) { 
    System.out.println(String.format("message [%s], hash [%d]", event.getMessage(), hashCode())); 
    this.message = event.getMessage(); 
    } 

    public String getMessage() { 
    return this.message; 
    } 
} 

public class Sender { 
    @Inject @Any 
    Event<DummyEvent> e; 

    public void fire(String message) { 
    System.out.println(String.format("fire message [%s], hash [%d]", message, hashCode())); 

    DummyEvent de = new DummyEvent; 
    de.setMessage(message); 
    e.fire(de); 
    } 
} 

@RunWith(Arquillian.class) 
public class Example { 
    @Deployment 
    public static JavaArchive createDeployment() { 
    return ShrinkWrap.create(JavaArchive.class).addClasses(Example .class, Receiver.class, Sender.class) 
     .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    } 

    @Inject 
    Receiver receiver; 

    @Inject 
    Sender sender; 

    @Test 
    public void dummy() { 
    System.out.println(String.format("sender hash [%d]", sender.hashCode())); 
    sender.fire("Hello from me"); 

    System.out.println(String.format("message [%s], receiver hash: [%d]", 
    receiver.getMessage(), receiver.hashCode())); 
    } 
} 

Что распечатана является следующее:

sender hash [785714873] 
firing event [value: Hello from me], hash [785714873] 
message [Hello from me], hash [632925108] 
message [null], receiver hash: [1085786565] 

то, что я не получаю, почему приемник хэш-коды отличаются, и событие НЕ распространяется на инъецированные Приемный компонент в примере JUnit. Скорее событие отправляется в какой-то другой компонент-получатель.

Это связано с областью видимости (которая должна быть по умолчанию @Dependent)?

+0

Пробный сварной шов (с использованием WeldJUnit4Runner) и получил те же результаты (т. Е. Не проблема Arquillian). –

+0

Добавление @ApplicationScoped к приемнику и добавление «notifyObserver = Reception.IF_EXISTS» в аннотацию Observes останавливает распространение события на «OTHER» bean-компонент. Заметил, что при не условном наблюдении (Reception.ALWAYS) для каждого события создается компонент-получатель. Совсем не то, что я ожидал. –

+0

Добавление @Singleton к приемнику дает правильное поведение, но не будет ограничиваться Singleton. Есть идеи? –

ответ

2

Похоже, Receiver и Sender не имеют определенных областей. В результате они получат @Dependent в качестве своего объема. Когда вы используете @Dependent, в каждую точку инъекции вводится новый экземпляр.

+0

Джон, задержка благодарности за праздничные дни за ваш ответ. –

+0

Добавление любой зависимости выше зависимости должно работать для вас (RequestScoped, ApplicationScoped и т. Д.). –

+0

John, yes-box, кроме этих вопросов, является побочным эффектом от http://stackoverflow.com/questions/20050437/cdi-extension-altering-processed-type, где целевой аннотированный тип, вероятно, имеет свою собственную область. И насколько я знаю, вы можете иметь несколько областей в одном управляемом компоненте (например, если я смешался в настраиваемой области). –

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