Spring JUnit Testing: проблемы с электропроводкой и транзакциями - PullRequest
3 голосов
/ 17 января 2011

У нас есть приложение 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. Автопроводка пропускает некоторые бобы
  2. Иногда бины не передаются для транзакций

Кажется, что пункт 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, но, похоже, это не помогло.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 29 июня 2011

Я думаю, что ваш тестовый класс должен расширяться от:

AbstractTransactionalJUnit4SpringContextTests

и затем вы можете настроить транзакционный материал с помощью:

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)

где defaultRollback определяет, выполнять ли откат после каждого теста.

...