Альтернативные дескрипторы OpenEJB не работают при использовании набора тестов jUnit

Мне удалось заставить альтернативные дескрипторы работать с моими модульными тестами, работающими на OpenEJB, используя заглушки для зависимых компонентов EJB, когда каждый тест выполняется самостоятельно. Но как только я представляю набор тестов, кажется, что дескриптор развертывания взят из первого теста, добавленного в набор.

Некоторый код, чтобы объяснить это лучше. Тестируемые бобы являются чем-то вроде

@Stateless
@Local(A.class)
public class ABean implements A {
     // Bean implementation, no dependencies
}


@Stateless
@Local(B.class)
public class BBean implements B {

     @EJB
     A aBean;  // Dependency to ABean

     // Rest of the implementation
}

И testcase для B (testcase для A аналогичен, за исключением того, что он не устанавливает свойство для использования альтернативного дескриптора)

public class BBeanTest {
    private B bean;

    @Before
    public void bootContainer() throws Exception {
        Properties props = new Properties();
        props.put(Context.INITIAL_CONTEXT_FACTORY,
               "org.apache.openejb.client.LocalInitialContextFactory");
        props.put("openejb.altdd.prefix", "test");  // Use stubs

        System.out.println("boot B: " + props);

        context = new InitialContext(props);
        bean = (B) context.lookup("BBeanLocal");
    } 
}

И как уже говорилось, все это прекрасно работает, когда выполняется в одиночку. Альтернативный дескриптор внедряет заглушку реализации интерфейса А.

При использовании следующего набора тестов все начинает разваливаться.

 @RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })
 public class MySuite {
      // Empty on purpose, annotations do the trick
 }

При запуске этого пакета альтернативный дескриптор для тестирования B не используется. Хотя вывод показывает, что по крайней мере свойство устанавливается перед каждым тестом

 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}

Если я переверну порядок загрузки тестов для набора, то есть добавлю BBeanTest.class перед ABeanTest.class, он будет использовать альтернативный дескриптор. Поскольку ABean не имеет зависимостей, в этом случае это будет работать нормально, но, вероятно, вызывает проблемы с большими установками с несколькими альтернативными дескрипторами.

Есть указатели?

Заранее спасибо.

РЕДАКТИРОВАТЬ На основе вывода журнала контейнер фактически загружается только один раз для первого теста, так как он занимает прибл. 2,5 секунды для выполнения, в то время как остальные занимают около 0,001 секунды.

ВерсияEDIT2 OpenEJB - это Apache OpenEJB 3.1.4, сборка: 20101112-03:32

1 ответ

Решение

Судя по выводу журнала, контейнер фактически загружается только один раз для первого теста, так как он занимает ок. 2,5 секунды для выполнения, в то время как остальные занимают около 0,001 секунды.

Как вы правильно заметили, инициализация происходит только один раз.


@RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })

Следовательно, в этом случае и ABeanTest, и BBeanTest выполнялись в одном и том же экземпляре контейнера с теми же начальными свойствами контекста, которые установлены ABeanTest.

В вашем случае, поскольку вам нужны разные настройки для двух тестовых классов, я думаю, что выгрузка экземпляра контейнера в ABeanTest @AfterClass и использование нового в BBeanTest должны сделать это.

Этот пост показывает, как

Другие вопросы по тегам