【问题标题】:weld 2.4.2.Final maven test焊缝 2.4.2.Final maven test
【发布时间】:2017-02-07 22:45:05
【问题描述】:

我们面临的问题与此处确定的问题相同:Weld using alternative producer from src/test/META-INF/beans.xml

对于 maven 和 Weld se,对于测试,weld 不使用位于 test/resources/META-INF 中的 beans.xml。

我们在谷歌上查看,我在 Weld 上查看 Jira 问题,但似乎其他人没有与我们相同的问题。

那么有人知道如何使用 Maven 在 Junit 测试中使用 Weld 并实现 Weld SE 由位于 test/resources/META-INF 中的 beans.xml 配置吗?

【问题讨论】:

    标签: maven weld


    【解决方案1】:

    Weld 本身无法帮助您解决此问题,Weld SE 实际上会选择类路径中的第一个 beans.xml。更准确地说,main/resources/META-INF/beans.xml 将用于 bean 归档 main/java/,而 test/resources/META-INF/beans.xml 将用于 bean 归档 test/java/。因此,将其混合起来充其量是不明智的,因此 Weld 默认不支持它。

    总之,有几种方法可以解决您的问题。

    1. 使用 Arquillian + Shrinkwrap

      对于 CDI 测试,这是您所希望的最好的方法,也是一种非常好的方法,一旦您学会了它。 Shrinkwrap 将允许您完全根据您的需要定制部署,仅包括您想要的类以及您想要的beans.xml。有一个 Arquillian container for Weld SE 甚至在 Weld SE 测试套件中使用,因此您可以在那里激发自己。

    2. 在引导 Weld SE 时禁用发现

      在您的单元测试中,您正在启动 Weld 容器。这样做时,您可能会使用Weld#disableDiscovery(),这意味着您将创建一个合成 bean 存档。在此类存档中,默认发现被禁用,并且只有您专门添加的内容(通过 methodsaddBeanClassesaddPackage、..)才会出现在生成的存档中。并且由于您没有发现,没有beans.xml 将被接收!相反,你定义了所有的替代方案,拦截器,...(同样在Weld class 上有这样的方法)。现在,我想如果您需要重复执行此操作,这可以“轻松”放入一些 @Before 方法中。或者,您也可以使用 Weld-junit,它会为您提供 JUnit @Rule,并允许您轻松描述每个类的部署。

    上述两种方法都应该可以帮助您克服这些困难。但正如我所说,仅使用普通的 Weld SE 是无法实现这一点的。

    【讨论】:

    • 您好,感谢您的回答,我们将尝试 Arquillian + Shrinkwrap。但是我们的观点是,当我们运行 maven test (id test/java/) 时,文件 test/resources/META-INF/beans.xml 没有被使用,这是 main/resources/META-INF 中使用的那个。
    • 是的,我的意思是,没有办法告诉 Weld “嘿,选这个!”。相反,我为您提供了两种替代方法来做您想做的事情。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2011-06-08
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多