2016-01-08 4 views
0

Я искал через Stackoverflow, чтобы найти ответ на мою проблему, нашел некоторые очень похожие проблемы, но ответа не нашел.Вложенная стеклянная планка не может развернуть модули EJB

Что я пытаюсь сделать: Создайте простой тест junit, в который встроен встроенный контейнер Glassfish 4.1, и проверена простая операция EJB.

Пример EJB:

@Stateless 
@LocalBean 
public class ExampleBean { 

    public int meaningOfLife() { 
     return 42; 
    } 
} 

Довольно просто. Вот мой блок тест:

public class BasicTest { 
    @EJB 
    private ExampleBean examplebean; 

    private static Context context; 

    private static EJBContainer container; 

    @BeforeClass 
    public static void init() { 

     Map<String,Object> props = new HashMap<String,Object>(); 
     //props.put(EJBContainer.MODULES, new File("target/classes")); 
     props.put(EJBContainer.MODULES, new File("D:\\Development\\IDE\\workspace-templates\\jee7-template\\template-service\\target")); 

     try { 
      container = EJBContainer.createEJBContainer(props);//.getContext().bind("inject", this); 
      context = container.getContext(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Мои pom.xml зависимостей:

<dependency> 
     <groupId>org.glassfish.main.extras</groupId> 
     <artifactId>glassfish-embedded-static-shell</artifactId> 
     <version>4.1</version> 
     <scope>system</scope> 
     <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath> 
    </dependency> 

Я также попытался с добавлением следующих зависимостей:

<dependency> 
     <groupId>org.glassfish.main.ejb</groupId> 
     <artifactId>ejb-container</artifactId> 
     <version>4.1</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>javax.ejb-api</artifactId> 
     <version>3.2</version> 
     <scope>test</scope> 
    </dependency> 

И результаты: встроенный контейнер GF 4.1 не смог загрузить этот простой EJB (он находится в папке target/classes после компиляции maven).

я получаю следующие ошибки, основанные на различных изменениях кода (например, используя свойства, передаваемые в контейнер или нет):

GF 4.1 Embedded UnsatisfiedDependencyException

GF 4.1 Embedded Can't deploy

GF 4.1 Embedded Can't deploy EJB classes

Кодекса Я вставил сообщение о последнем сообщении об ошибке.

И я не понимаю. Везде, где я ищу информацию, говорит, что это должно сработать.

Кроме того, если я попробую это, с контейнером OpenEJB (к сожалению, это просто jee6), он отлично работает.

<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>openejb-core</artifactId> 
    <version>4.7.3</version> 
    <scope>test</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0-6</version> 
    <scope>test</scope> 
    </dependency> 

Спасибо за помощь!

+0

Странная вещь, я получаю немного другой выход, когда работает один и тот же тест с IntelliJ Idea (первый пробег был от затмения). См. Вывод здесь: http://pastebin.com/DBxwRjCm – csabee

ответ

0

Предположительно не совсем ответ на вопрос, но некоторые более общие мысли к блоку EJBs тестирования:

тест устройства, как следует из названия, следует проверить только сам аппарат, больше ничего. А поскольку EJB 3.x beans - POJO, вы можете просто написать простой JUnit-тест, не имея необходимости (встроенного) контейнера. И что касается ссылок на другие бобы, используйте фреймворк, например, Mockito, чтобы высмеять их.

При проведении тестирования интеграции, где вы хотите, чтобы несколько EJB взаимодействовали, возможно, в сотрудничестве с базой данных, тогда вам понадобится контейнер, например. для инъекции зависимости. Вы можете использовать встроенный контейнер здесь, но вы также можете использовать фреймворк вроде Arquillian, так как там у вас есть возможность использовать реальный контейнер.

+0

Как вы можете видеть, я начинал с очень простого теста. Мы не используем arquillian, так как он пропускает функции, которые нам потребуются. Кроме того, я нахожу mockito бесполезным. Поэтому, пожалуйста, постарайтесь быть полезными, я хотел бы, чтобы решение моей проблемы, о том, почему встроенный контейнер терпит неудачу. – csabee

+0

Также: для разработки продукта мы хотели бы использовать встроенную оболочку сервера приложений, поэтому модульный тест является очень хорошей отправной точкой для этого. – csabee

+0

@csabee Ну, как я уже сказал, это было немного не по теме, но я старался быть полезным. Потому что многие люди пытаются использовать гораздо больше в модульном тесте, так как должно быть, например. вложенные контейнеры, вместо того чтобы использовать насмешку, которая была разработана для этого. –

0

Я думаю, что нашел решение моей проблемы (в настоящее время это работает, но я не уверен, если это настоящий).

Зависимости исправленные:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.main.common</groupId> 
    <artifactId>simple-glassfish-api</artifactId> 
    <version>4.1</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.main.extras</groupId> 
    <artifactId>glassfish-embedded-static-shell</artifactId> 
    <version>4.1</version> 
    <scope>system</scope> 
    <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath> 
</dependency> 

Так что на самом деле не хватает является org.glassfish.main.common/простой GlassFish-апи банка (на самом деле не знаю, почему это решение моей проблемы).

А вот фиксированный код:

public class BasicTest { 
@EJB 
private ExampleBean examplebean; 
private Context context; 
private EJBContainer container; 

@Before 
public void init(){ 
    try { 
     container = EJBContainer.createEJBContainer(); 
     context = container.getContext(); 
     context.bind("inject", this); 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Test 
public void testmeaning() throws NamingException{ 
    if(examplebean == null){ 
     examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean"); 
    } 

    assertEquals(42, examplebean.meaningOfLife()); 
} 
} 

Или используя статические члены с @BeforeClass

public class BasicTest { 

@EJB 
private ExampleBean examplebean; 
private static Context context; 
private static EJBContainer container; 

@BeforeClass 
public static void init() { 
    container = EJBContainer.createEJBContainer(); 
    context = container.getContext(); 
} 

@Test 
public void testmeaning() throws NamingException { 
    if (examplebean == null) { 
     examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean"); 
    } 
    assertEquals(42, examplebean.meaningOfLife()); 
} 

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