Альтернативные дескрипторы OpenEJB не работают при использовании набора тестов jUnit - PullRequest
1 голос
/ 28 сентября 2011

Мне удалось заставить альтернативные дескрипторы работать с моими модульными тестами, работающими на 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
}

И контрольный пример для B (контрольный пример для 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 Ответ

1 голос
/ 04 октября 2011

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

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


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

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

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

В этом блоге показано, как

...