Внедрение @EJB в Arquillian завершается с ошибкой из-за невозможности внедрить ресурс - скорее всего, неправильная реализация SPI InjectionServices

Я начинаю работу с Arquillian, следуя общему руководству по началу работы, которое я могу успешно воспроизвести, но < href="http://arquillian.org/guides/getting_started_rinse_and_repeat/" rel="nofollow noreferrer">использование его для тестирования EJB не удается из-за Unable to inject resource - most probably incorrect InjectionServices SPI implementation, что приводит к тому, что свойство @EJB не внедряется/null, таким образом, может тест на провал.

Расширение примера приветствия демонстрирует проблему:

@Local
public interface GreeterIface {

    void greet(PrintStream to, String name);

    String createGreeting(String name);
}

EJB:

@Stateless
public class Greeter implements GreeterIface{
    @Override
    public void greet(PrintStream to, String name) {
        to.println(createGreeting(name));
    }

    @Override
    public String createGreeting(String name) {
        return "Hello, " + name + "!";
    }
}

и тест:

@RunWith(Arquillian.class)
public class GreeterTest {

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
            .addClasses(Greeter.class, GreeterIface.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @EJB
    private Greeter greeter;

    @Test
    public void should_create_greeting() {
        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }
}

терпит неудачу из-за

Jun 20, 2017 3:03:19 PM org.jboss.weld.injection.AbstractResourceInjection getResourceReference
WARN: WELD-000834: Unable to inject resource - most probably incorrect InjectionServices SPI implementation: private richtercloud.arquillian.demo.Greeter richtercloud.arquillian.demo.GreeterTest.greeter
    at richtercloud.arquillian.demo.GreeterTest.greeter(GreeterTest.java:0)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.012 sec <<< FAILURE! - in richtercloud.arquillian.demo.GreeterTest
should_create_greeting(richtercloud.arquillian.demo.GreeterTest)  Time elapsed: 0.035 sec  <<< ERROR!
java.lang.NullPointerException: null
    at richtercloud.arquillian.demo.GreeterTest.should_create_greeting(GreeterTest.java:33)

Лучшие, но бесполезные подсказки дает

  • @EJB-инъекция с Arquillian на WebLogic 10.3.5 не работает (содержит неработающие ссылки и упоминает WebArchive, тогда как в официальном руководстве используется JarArchive как для SE, так и для EE, поэтому я предполагаю, что JarArchive правильный)
  • Внедрение зависимостей не работает в Arquillian Test покрывает сбой внедрения, но это вызвано отсутствием классов в архиве, что не так для меня
  • Внедрение @Stateless EJB в тесты Arquillian связано с ошибкой Unsatisfied dependencies for type [MyEjbRemote] with qualifiers [@Default] at injection point [[field] @Inject private com.org.app.ejb.InjectionTest.ejb], которую я также получил в какой-то момент, но не помню когда, в этом большом потоке бесполезных необъяснимых сообщений об ошибках

MCVE — это https://github.com/krichter722/arquillian-demo (расширенный проект Java SE который должен работать на основе руководства) и https://github.com/krichter722/arquillian-demo-2 (мой собственный проект Java EE)

Я использую Arquillian 1.1.13.Final.


person Karl Richter    schedule 20.06.2017    source источник
comment
Как я вижу, в тестах используетсяweld-se, а не ejb-контейнер, поэтому @EJB @Resource, @Transact... не сработает. Если запуск wildfly для тестов требует больших усилий, существуют расширения, предназначенные для имитации EJB в тестовой среде, возможно, cdi-unit и ejb-cdi-unit могут помочь. См. github для получения дополнительной документации.   -  person aschoerk    schedule 17.07.2017


Ответы (2)


Как выглядит ваш pom.xml? Вам нужно добавить некоторую дополнительную информацию, чтобы arquillian мог запустить контейнер и запустить тесты.

В руководстве «Начало работы» они запускают только приложение CDI и используют сварку в качестве реализации для управления впрыском необходимых бобов. Но в вашем случае вы хотите проверить инъекцию bean-компонента без гражданства. В этом случае вам нужно добавить контейнер, такой как jboss/wildfly или glassfish, для запуска тестов.

В этом руководстве arquillian показано, как использовать @EJB в тесте arquillian: Начало работы: промойте и повторите

В руководстве используется JBoss AS 7. Если вы хотите вместо этого использовать wildfly 10, вы можете использовать следующую зависимость:

<dependency>
    <groupId>org.wildfly.arquillian</groupId>
    <artifactId>wildfly-arquillian-container-remote</artifactId>
    <version>2.1.0.Alpha3</version>
</dependency>
person Georg Leber    schedule 21.06.2017

Решением будет использование адаптера Arquillian для встроенного контейнера TomEE (на основе OpenEJB). Добавьте в свои тестовые зависимости:

         <dependency>
            <groupId>org.apache.tomee</groupId>
            <artifactId>arquillian-openejb-embedded</artifactId>
            <version>7.0.5</version> <!-- or whatever version you need -->
            <scope>test</scope>
         </dependency>
person Michail Alexakis    schedule 16.05.2020