Инъекция не работает в тесте Arquillian - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь сделать простое приложение, используя JavaEE, и в настоящее время я застрял с тестом Arquillian. У меня есть класс BookRepository, как это:

package com.pluralsight.bookstore.repository;

import javax.transaction.Transactional;
import static javax.transaction.Transactional.TxType.SUPPORTS;

@Transactional(SUPPORTS)
public class BookRepository {

}

И тестовый класс BookRepositoryTest:

package com.pluralsight.bookstore.repository;

@RunWith(Arquillian.class)
public class BookRepositoryTest {

    @Inject
    private BookRepository bookRepository;

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
                .addClass(BookRepository.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml");
    }

    @Test
    public void create() {
        assertNotNull(bookRepository);
    }
}

Запуск результатов теста в:

    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 9.864 sec <<< FAILURE!
    create(com.pluralsight.bookstore.repository.BookRepositoryTest)  Time elapsed: 0.287 sec  <<< ERROR!
    java.lang.NullPointerException
            at com.pluralsight.bookstore.repository.BookRepositoryTest.create(BookRepositoryTest.java:38)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            ...

Без каких-либо объяснений. Как я проверял с помощью assertNotNull, bookRepository всегда имеет значение null, поэтому инъекция здесь не работает, я думаю. Структура проекта выглядит следующим образом: enter image description here

Я пытался найти ответ в течение некоторого времени, и я все еще на том же месте. Для контейнера я запускаю тест с удаленным wildfly, и в фоновом режиме работает WildFly. Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Хорошо, так что я наконец-то заставил это работать. Видимо, я использовал неправильную аннотацию @Inject. Я использовал Arquillian, а не Javax. Я изменил

import org.jboss.arquillian.core.api.annotation.Inject;

в моем классе теста

import javax.inject.Inject;

И это сработало как шарм. Было действительно раздражающе выслеживать, и на самом деле я нашел это по счастливой случайности, так что я надеюсь, что это поможет кому-то в будущем.

0 голосов
/ 28 апреля 2018

Wildfly - это AS EE 7, совместимый с Java, в JavaEE 7 CDI-бины по умолчанию обнаруживаются при аннотировании, смотрите Включение CDI по умолчанию в Java EE 7 , что, возможно, в вашем случае у вас пустые бины .xml. Поэтому для введения BookRepository необходимо добавить аннотацию области (см. Области CDI ), для istance @ApplicationScoped:

@ApplicationScoped
@Transactional(SUPPORTS)
public class BookRepository {

}

Или вы должны включить beans.xml с режимом обнаружения all следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
       http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

поместите его в src / test / resources, чтобы включить его в тестовую модификацию следующим образом:

package com.pluralsight.bookstore.repository; 

@RunWith(Arquillian.class) 
public class BookRepositoryTest { 

    @Inject 
    private BookRepository bookRepository; 

    @Deployment 
    public static JavaArchive createDeployment() { 
         return ShrinkWrap.create(JavaArchive.class) 
                                         .addClass(BookRepository.class) 
                                         .addAsManifestResource("META-INF/beans.xml", "beans.xml")
                                         .addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml"); 
     } 

    //...

}
...