2016-01-04 3 views
0

Я пытаюсь реализовать jUnit для тестирования EJB. Тест отлично работает, если я использую контекст JNDI один раз. Но, если я использую контекст второй раз я получаю следующее исключение:Контекст JNDI работает только один раз (тест EJB с jUnit)

java.lang.IllegalStateException: No EJB receiver available for handling 
    [appName:Name, moduleName:NameEJB, distinctName:] combination for 
    invocation context org.jboss.ejb.client.EJBClientInvocationContext 
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(
    EJBClientContext.java:774) 
... 

нАлАдкА() тестового класса выглядит следующим образом:

private NameDAO nameDAO; 

@Before 
public void setUp() throws Exception { 

    try { 
     final Hashtable<String, Comparable> jndiProperties = 
      new Hashtable<String, Comparable>(); 

     jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080"); 
     jndiProperties.put(Context.SECURITY_PRINCIPAL, "user"); 
     jndiProperties.put(Context.SECURITY_CREDENTIALS, "password"); 
     jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, 
       "org.jboss.naming.remote.client.InitialContextFactory"); 
     jndiProperties.put("jboss.naming.client.ejb.context", true); 

     final Context context = new InitialContext(jndiProperties); 

     final String lookupName = "Name/NameEJB/NameBean!com.myname.ejb.interfaces.NameDAO"; 

     nameDAO = (NameDAO) context.lookup(lookupName); 

    } catch (Exception e) { 
     throw e; 
    } 
} 

Использование nameDAO объект в тесте в первый раз хорошо работает. Использование этого во второй раз вызывает исключение выше.

Любые идеи?

Я использую Java EE 7 с Wildfly 9.

Спасибо за любую помощь.

ответ

1

То, что вы пытаетесь сделать, это «удержать» и повторно использовать ссылку на службу EJB (nameDAO) для разных методов. То, что вам не хватает, состоит в том, что в конечном итоге, когда вы выполняете поиск и получаете ссылку, вы получаете прокси из компонента, который либо создается «на лету» сервером (или вы получаете пул). Когда вы вызываете службу и завершаете ее, контейнер возвращает экземпляр обратно в пул (или уничтожает его) - в зависимости от версии сервера и спецификации. Причина, по которой во второй раз это не работает, заключается в том, что этот конкретный прокси-сервер, который вы держите в качестве частной переменной в своем тесте, не указывает на «живой» экземпляр. Вам нужно сделать новый запрос в контейнер (поиск) для другого экземпляра.

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

Последнее, но не менее важное: я бы очень хотел, чтобы вы взглянули на Arquillian, что делает такое тестирование намного проще для внедрения и обслуживания. См официальное руководство here или образец пост here

Надежда, что помогает :)

+0

Спасибо за намек на Аркиллиан. Я до сих пор не понял, почему прокси теряется. Мне все равно хотелось бы найти, почему он раздавит. – Marcus

+0

Вот как работают фасонные сессионные бобы и вообще эта спецификация технологии. Ссылки EJB (ы) объединены и повторно используются. Это делается контейнером автоматически. Когда ваш первый метод завершается, прокси-сервер, который указывает ton NameDAORef1, больше не действует, поскольку контейнер вернул эту ссылку обратно в пул. Вам нужно получить новый. – javapapo

0

Это не так, как вы модульного тестирования EJB-компонент. Вам почти никогда не нужно больше искать JNDI.

В то время как ссылка @ javapapo на Arquillian хороша, когда в ней требуются механизмы контейнера, такие как инъекция зависимостей, такой тест является интеграционным тестом нескольких компонентов. При написании модульного теста вы хотите только протестировать устройство, и с EJB 3.x вы можете это сделать, поскольку EJB является POJO и, таким образом, не отличается от любого другого простого старого класса Java, который вы тестируете. Таким образом, единственное, что вам нужно, - это насмешливая структура, такая как Mockito, чтобы высмеять ссылки на другие бобы, которые в реальном контейнере будут заполнены DI.

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