Сварка (CDI): куда я могу поместить свой тестовый файл beans.xml, который настраивает <alternatives>? - PullRequest
3 голосов
/ 08 сентября 2011

Мое веб-приложение имеет непустую продукцию beans.xml в src/main/resources/META-INF.Теперь для моих тестов мне нужно поменять 1 боб с альтернативой.

Куда я помещаю этот тест beans.xml, который содержит только это и ничего более?

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

Iпробовал под src/test/resources/META-INF но это игнорируется.Я использую arquillian, и мой тестовый путь к классам добавлен в ShrinkWrap.

Ответы [ 5 ]

4 голосов
/ 10 февраля 2014

Даже если это уже принято, я отправлю вам решение, которое я нашел. У меня была та же проблема, и использование @Specializes не было для меня вариантом, потому что у меня было много макетов с несколькими методами, поэтому создание для каждого класса было немного излишним ....

Итак, в моем тесте у меня есть ResourceMock:

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

С помощью следующего ShrinkWrap я смог загрузить эти bean-компоненты @Alternative только во время теста: (в каталоге dir не требуется 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");

И это все.

3 голосов
/ 19 января 2012

Не используйте @Alternative, но используйте @Specializes.Просто поместите бин @Specializes только в ваш тестовый путь, и он автоматически заменит реальный боб.Не нужно возиться с beans.xml.

2 голосов
/ 24 марта 2012

Или, если вам нужно использовать @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());
}

Надеюсь, это поможет!

0 голосов
/ 14 ноября 2016

В моем случае я использовал приведенный ниже код, чтобы указать, какой beans.xml файл должен содержать:

JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
                .addClasses(AutoService.class, AutoServiceCallerImp1.class, AutoServiceCallerImp2.class)
                .addAsManifestResource("META-INF/test.beans.xml", "beans.xml");
0 голосов
/ 09 сентября 2011
...