2012-04-10 4 views
6

Я использую Arquillian для тестирования сессионного компонента без состояния, который имеет явный локальный и удаленный интерфейс. Но в тесте Аркиллиан не «вводит» ничего в поле, которое имеет тип локального интерфейса, но работает для удаленного интерфейса.Explicite Local EJB не инъецируется Arquillian

@Stateless 
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote { 
    public String greet() { 
     return "hallo"; 
    } 
} 

Удаленный интерфейс:

@Remote 
public interface TestServiceRemote { 
    public String greet(); 
} 

Интерфейс локали:

@Local 
public interface TestServiceLocal { 
    public String greet(); 
} 

И это испытание:

@RunWith(Arquillian.class) 
public class GenericEntityDaoEjbIntegrationTest { 

    @Deployment 
    public static JavaArchive createTestArchive() 
        throws UnsupportedEncodingException { 
     return ShrinkWrap.create(JavaArchive.class, "test.jar") 
       .addClasses(
         TestServiceLocal.class, 
         TestServiceRemote.class, 
         TestServiceImpl.class); 
    } 

    @EJB 
    private TestServiceLocal testServiceLocal; 

    @EJB 
    private TestServiceRemote testServiceRemote; 

    //Will Fail 
    @Test 
    public void testTestServiceLocal() { 
     assertNotNull(this.testServiceLocal); 
    } 

    //Success  
    @Test 
    public void testTestServiceRemote() { 
     assertNotNull(this.testServiceRemote); 
    }  
} 

Я использую arquillian-GlassFish встраиваемый 1.0.0.CR2, glassfish-embedde d-все 3,1 и arquillian-JUnit-контейнер 1.0.0.CR5 Соответствующая часть моего ПОМ:

<!-- arquillian test --> 
    <dependency> 
     <groupId>org.jboss.arquillian.junit</groupId> 
     <artifactId>arquillian-junit-container</artifactId> 
     <version>1.0.0.CR5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.arquillian.container</groupId> 
     <artifactId>arquillian-container-spi</artifactId> 
     <version>1.0.0.CR5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.arquillian.container</groupId> 
     <artifactId>arquillian-glassfish-embedded-3.1</artifactId> 
     <version>1.0.0.CR2</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.extras</groupId> 
     <artifactId>glassfish-embedded-all</artifactId> 
     <version>3.1</version> 
     <scope>test</scope> 
    </dependency> 

Это соответствующая часть файла журнала (он не содержит каких-либо исключений):

10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome 
INFO: Portable JNDI names for EJB TestServiceImpl : [java:global/test/TestServiceImpl!de.test.service.TestServiceRemote, java:global/test/TestServiceImpl!de.test.service.TestServiceLocal] 
10.04.2012 15:38:16 com.sun.ejb.containers.BaseContainer initializeHome 
INFO: Glassfish-specific (Non-portable) JNDI names for EJB TestServiceImpl : [de.test.service.TestServiceRemote, de.test.service.TestServiceRemote#de.test.service.TestServiceRemote] 
10.04.2012 15:38:16 com.sun.enterprise.web.WebApplication start 
INFO: WEB0671: Loading application [test] at [/test] 
10.04.2012 15:38:16 org.glassfish.deployment.admin.DeployCommand execute 
INFO: test was successfully deployed in 11.844 milliseconds. 

В чем моя ошибка? Что мне нужно изменить, чтобы получить экземпляр, введенный для интерфейса локали?

ответ

12

Вы можете использовать одно из следующих действий:

  • Добавить beans.xml файл развертывания:

    return ShrinkWrap.create(JavaArchive.class, "test.jar") 
           .addClasses(
             TestServiceLocal.class, 
             TestServiceRemote.class, 
             TestServiceImpl.class) 
           .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    

    Это позволяет CDITestEnricher из Arquillian, который является гораздо более способными, чем EJBTestEnricher. Он может обрабатывать аннотации @Inject (очевидно), а также @Resource и @EJB аннотаций (см. Раздел «Впрыскивание ресурсов в спецификации CDI»). Затем контейнер обрабатывает как аннотированные поля @EJB в вашем экземпляре тестового класса, так и точки инъекции и вводит зависимости.

  • Указать mappedName для аннотации @EJB для поля с портативным JNDI-именем развернутого компонента. В вашем случае, это будет выглядеть так:

    @EJB(mappedName="java:global/test/TestServiceImpl!com.acme.TestServiceLocal") 
    private TestServiceLocal testServiceLocal; 
    

    Вы должны убедиться, что переносимое имя JNDI является таким же, как тот, созданным для развертывания. Я просто указал тот, который был создан для моего интерфейса «com.acme.TestServiceLocal».

1

Попробуйте изменить TestServiceImpl-> TestServiceBean это выглядит, что внедренные GlassFish имеют специфические требования к имени боба

5

В дополнение к ответам вы должны также гарантировать, что Вы используете правильный @Deployment параметр является правильным. Чтобы ввести локально, вы должны убедиться, что у вас есть @Deployment(testable=true) (обратите внимание, что это значение по умолчанию).

От Aquillian docs:

В-контейнера режим: @Deployment (проверяемый = истина)

Как мы уже упоминали выше, мы должны упакуйте @Deployment, добавив некоторые Arquillian классов поддержки , для запуска внутри контейнера. Это дает нам возможность общаться с тестом, обогатить тест и провести тест удаленно. В этом режиме тест выполняется в удаленном контейнере ; Аркильян использует этот режим по умолчанию.

См. Ссылку на полный протокол для обзора ожидаемого результата процесса упаковки, когда вы предоставляете @Deployment.

Режим клиента: @Deployment (проверяемым = ложь)

Теперь этот режим является легкой частью. В отличие от режима в контейнере, который переупаковывает и отменяет выполнение теста, режим as-client делает как можно меньше. Он не переупаковывает вашу @Deployment и не выполняет , а перенаправляет выполнение теста на удаленный сервер. Ваш тестовый пример: работает в вашей JVM, как и ожидалось, и вы можете протестировать контейнер со стороны, как это видят ваши клиенты. Единственное, что делает Arquillian , это контролировать жизненный цикл вашего @Deployment.

Вот пример вызова сервлета, использующего как клиентский режим.

Это не помогает ОП (у них были правильные настройки), но я надеюсь, что это поможет тем, кто прибывает из Google, как и я.

Смежные вопросы