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