Unit testing 使用CDI和ServletContextListener对应用程序进行单元测试

Unit testing 使用CDI和ServletContextListener对应用程序进行单元测试,unit-testing,junit,cdi,cdi-unit,Unit Testing,Junit,Cdi,Cdi Unit,我有一个CDI web应用程序,它有一个ServletContextListener,可以在启动时初始化一些东西 在该ServletContextListener中,会发生以下情况: 这已经足够好了,因为这样可以确保在实例化其他CDIBean之前执行init(比如App,它也会注入Config本身) 然而,我无法解决如何实现单元测试的这种逻辑。有了jglue的CDI单元,我可以在我的测试课上做到这一点: @Inject Config config; @Inject App applicatio

我有一个CDI web应用程序,它有一个ServletContextListener,可以在启动时初始化一些东西

在该ServletContextListener中,会发生以下情况:

这已经足够好了,因为这样可以确保在实例化其他CDIBean之前执行init(比如App,它也会注入Config本身)

然而,我无法解决如何实现单元测试的这种逻辑。有了jglue的CDI单元,我可以在我的测试课上做到这一点:

@Inject
Config config;

@Inject
App application;

但是当我运行我的测试时,我不断地遇到问题,因为应用程序中的@PostConstruct需要配置已经初始化。那么,我怎样才能及时调用Config.init()方法呢?

您是否尝试过使用
实例
?例如,编程查找。除非执行
Instance.select(…).get()
,否则它不会解析为实际的bean。这可能会造成足够的延迟,您可以先调用
Config
,然后再调用
App
。让我知道这是否有效。有点走神了,但我描述的应用程序系统是不是很奇怪?我可以将其更改为更“标准”的版本,但我认为这相当简单。事实上,拥有一个非自包含的bean(需要通过系统中的外部调用进行初始化)是不寻常的。ok。那么什么是更好的解决方案呢?这在很大程度上取决于init方法的功能。可能,您可以切换到创建完全初始化的配置对象的producer方法。我认为甚至可以在那里注入servlet上下文(尽管不是100%确定)。或者让config init的构造函数作为完整的对象(在这里,servlet上下文的构造函数注入也应该是可能的)。无论您如何做,每个bean都应该在可供注入时完全初始化。这样,容器就可以自己管理所有依赖项。
@Inject
Config config;

@Inject
App application;