Альтернативные дескрипторы 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 должны сделать это.
Этот пост показывает, как