如何在JUnit中触发AfterBeanDiscovery

时间:2012-05-15 23:35:24

标签: unit-testing cdi

我有以下四个类:DataConsumer,DataProducer,SomeQualifier,META-INF / beans.xml和测试。类文件编码如下:

public class DataConsumer {

private boolean loaded = false;

@Inject
@SomeQualifier
private String someString;

public void afterBeanDiscovery(
        @Observes final AfterBeanDiscovery afterBeanDiscovery,
        final BeanManager manager) {
    loaded = true;
}

public boolean getLoaded() {
    return loaded;
}

public String sayHello() {
    return someString;
}

}

public class DataProducer {

@Produces
@SomeQualifier
private final String sample = "sample";
}

public @interface SomeQualifier {

}

单元测试看起来像这样。

public class WeldTest {
@Test
public void testHelloWorld() {
    final WeldContainer weld = new Weld().initialize();
    final DataConsumer consumer = weld.instance()
            .select(DataConsumer.class).get();
    Assert.assertEquals("sample", consumer.sayHello());
    Assert.assertTrue(consumer.getLoaded());
}
}

然而,在assertTrue上使用getLoaded()失败,似乎@Observes没有被触发。

2 个答案:

答案 0 :(得分:0)

看看arquillian:www.arquillian.org。它会照顾你所有这些。

答案 1 :(得分:0)

我发现了一个回答我问题的类似问题

CDI - Observing Container Events

虽然我无法将DataConsumer用作Extension和CDI托管bean。所以它需要第三类才能成为扩展。但是,因为Extension尚未创建托管bean,因为它们尚未创建,我得出结论,使用@Observes AfterBeanDiscovery来修改bean数据是不可能的解决方案。即使传入的BeanManager也找不到任何bean。