我们面临的问题与此处确定的问题相同:Weld using alternative producer from src/test/META-INF/beans.xml。
对于maven和weld se,为了测试,焊接不使用位于test / resources / META-INF中的beans.xml。
我们关注Google,以及我对Weld的Jira问题,但似乎其他人没有比我们更多的问题。
那么有人知道如何在Mait的Junit测试中使用焊接并实现Weld SE是由位于test / resources / META-INF中的beans.xml配置的吗?
答案 0 :(得分:0)
Weld本身无法帮助你,Weld SE实际上会选择类路径上的第一个beans.xml
。更准确地说,main/resources/META-INF/beans.xml
将用于bean归档main/java/
,而test/resources/META-INF/beans.xml
将用于bean归档test/java/
。因此,混合使用最好是不明智的,所以Weld默认不支持它。
无论如何,有几种方法可以解决您的麻烦。
使用Arquillian + Shrinkwrap
对于CDI测试,一旦你学会了,这是你可以期望的最佳方式和非常好的方式。 Shrinkwrap将允许您完全根据您的需要定制部署,包括您想要的类以及您想要的beans.xml
。有一个Arquillian container for Weld SE甚至可以在Weld SE测试套件中使用,所以你可以在那里激励自己。
引导Weld SE时禁用发现
在单元测试的某个地方,您正在启动Weld容器。这样做时,您可以使用Weld#disableDiscovery()
,这意味着您将创建一个合成bean存档。在此类存档中,默认发现已被停用,只有您专门添加的内容(通过methods,例如addBeanClasses
,addPackage
,...)将落在生成的存档中。而且,由于你没有发现,没有beans.xml
将会被接收!相反,你定义了所有的替代品,拦截器,...... (同样在Weld
class上有这方面的方法)。现在,我想如果您需要反复执行此操作,可以“轻松”将其放入某些@Before
方法中。或者,您也可以使用Weld-junit
,它将为您提供JUnit @Rule
,并允许您轻松描述每个类的部署。
上述两种方法都可以帮助您度过难关。但正如我所说,只有普通的Weld SE才能实现这一目标。