3

我的 webappbeans.xmlsrc/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。

4

5 回答 5

5

即使它已经被接受,我也会将我找到的解决方案发布给您。我遇到了同样的问题,并且使用@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");

就是这样。

于 2014-02-10T16:23:57.200 回答
3

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

于 2012-01-19T11:02:13.957 回答
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());
}

希望有帮助!

于 2012-03-24T16:39:08.570 回答
0

就我而言,我使用下面的代码来指定beans.xml要包含的文件:

JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
                .addClasses(AutoService.class, AutoServiceCallerImp1.class, AutoServiceCallerImp2.class)
                .addAsManifestResource("META-INF/test.beans.xml", "beans.xml");
于 2016-11-14T13:58:19.287 回答