У нас есть приложение Java EE, которое использует Spring и переходит от конфигурации xml к автоматическому подключению. Мы только что преобразовали большинство наших EJB-компонентов в бины Spring, но в настоящее время по-прежнему используем MDB и таймеры EJB.
- БЫЛО 7.0
- Java 6
- Пружина 3.0.5
- JUnit 4.8.1
Я также нахожусь в процессе написания интеграционных тестов в JUnit. Мои интеграционные тесты используют большинство файлов конфигурации контекста, как при работе в WAS, но не вещи, которые связаны с JNDI или используют диспетчер транзакций JTA. Для них у меня есть эквиваленты, которые настраивают очереди ActiveMQ, менеджер транзакций Hibernate и т. Д.
Мой тест выглядит так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/junit-container-context.xml",
"/spring-contexts/service-context.xml",
"/spring-contexts/integration-context.xml",
"/available-tests-context.xml" })
public class TestCase1Runner {
@Autowired
TestCase1 test;
@Autowired
private ApplicationContext applicationContext;
@Before
public void setupErrorHandling() {
// Some setup
}
@Test
@Transactional
public void run() throws Exception {
test.executeTest();
}
}
У моих тестов проблемы по крайней мере по нескольким причинам:
- Автопроводка пропускает некоторые бобы
- Иногда бины не передаются для транзакций
Кажется, что пункт 1 как-то связан с круговыми ссылками. Я сделал копии некоторых бобов, у которых были проблемы с автопроводкой. Я сделал копии в той же упаковке. Копия подключается, но не оригинал. Затем я начал перемещать ссылки в контекстных файлах xml из оригинала в копию, и в какой-то момент копия больше не подключается, а оригинал. У меня есть следующее в одном из файлов контекста (с измененными именами, чтобы защитить меня:):
<context:component-scan
base-package="com.mycompany.package1,com.mycompany.package2" />
<context:annotation-config />
Я думаю, что вторая сущность избыточна, но должна быть безвредной.
Я не вижу ошибок в журналах. Я включил ведение журнала для отладки и увидел, что большинство bean-компонентов были автоматически подключены, но в Spring эти ошибки, похоже, не пропускаются.
Элемент 2 может быть связан с Элементом 1. Некоторые бины неправильно проксированы для обработки транзакций. В моем контексте только для JUnit у меня есть следующее:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="servicePointcut"
expression="execution(public * com.mycompany.package1..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" />
</aop:config>
В некоторых местах я получаю ошибки гибернации, потому что транзакции отсутствуют, а в других - компоненты проксируются и транзакции запускаются. И прокси-компоненты, и не-прокси-компоненты находятся в подпакетах com.mycompany.package1
.
Конечно, все это работает, когда мы запускаем приложение в WAS. Он использует ContextSingletonBeanFactoryLocator. Я тоже это пробовал в JUnit, но, похоже, это не помогло.
Спасибо за любую помощь.