Weld(CDI):我在哪里放置我的仅测试bean.xml来配置<alternatives>?</alternatives>

时间:2011-09-08 13:44:40

标签: jboss-weld jboss-arquillian

我的网络应用在beans.xml下有非空制作src/main/resources/META-INF。 现在,对于我的测试,我需要替换掉1个bean。

我在哪里放置此测试beans.xml只包含此内容而已?

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <alternatives>
    <class>...MyTestReplacement</class>
  </alternatives>
</beans>

我在src/test/resources/META-INF下尝试但是被忽略了。我正在使用arquillian,我的测试类路径被添加到ShrinkWrap。

5 个答案:

答案 0 :(得分:4)

即使它已经被接受了,但是我找到了解决方案。我遇到了同样的问题,并且使用@Specializes对我来说没有选择,因为我有很多嘲讽有几种方法,因此为每一个创建一个类有点矫枉过正....

所以在我的测试中我有一个ResourceMock:

@Produces
@Alternative
public IResource createResource() {
    Resource resource = mock(Resource.class);
    when(resource.getLocalized(anyString())).then(AdditionalAnswers.returnsFirstArg());
    return resource;
}

使用以下ShrinkWrap,我只能在测试期间加载那些@Alternative bean :(测试目录中没有beans.xml!)

return ShrinkWrap
            .create(JavaArchive.class)
            .addPackages(true, "some.package.with.classes")
            .addAsManifestResource(
                    new StringAsset(
                            "<alternatives><class>my.testclass.with.alternatives</class></alternatives>"),
                    "beans.xml");

就是这样。

答案 1 :(得分:3)

不要使用@Alternative,而是使用@Specializes。只需将@Specializes bean放在测试类路径中,它就会自动替换真正的bean。不需要乱用beans.xml。

答案 2 :(得分:2)

或者,如果您需要使用@Alternative,则可以使用shrinkwrap命令.alternativeClass。您可以在Arquillian-showcase,cdi-ejb子项目中看到以下示例。在你的pom中加入这种依赖:

    <dependency>
        <groupId>org.jboss.shrinkwrap.descriptors</groupId>
        <artifactId>shrinkwrap-descriptors-impl</artifactId>
        <scope>test</scope>
    </dependency>

然后使用这种类型的@Deployment(对于Glassfish):

    @Deployment
    public static WebArchive createDeploymentForGlassFish() {
    BeansDescriptor beansXml = Descriptors.create(BeansDescriptor.class);

    return ShrinkWrap.create(WebArchive.class)
            .addClasses(FireAndForget.class, FireAndForgetBean.class, BlockingFireAndForgetAlternativeBean.class)
            .addAsWebInfResource(
                    new StringAsset(beansXml.alternativeClass(BlockingFireAndForgetAlternativeBean.class).exportAsString()),
                    beansXml.getDescriptorName());
}

希望有所帮助!

答案 3 :(得分:0)

答案 4 :(得分:0)

在我的情况下,我使用bellow中的代码来指定要包含的beans.xml文件:

JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
                .addClasses(AutoService.class, AutoServiceCallerImp1.class, AutoServiceCallerImp2.class)
                .addAsManifestResource("META-INF/test.beans.xml", "beans.xml");