3

我们有一个现有的 Java EE 应用程序,它利用了 Spring,并且正在从 xml 配置过渡到自动装配。我们刚刚将大部分 EJB 转换为 Spring bean,但目前仍在使用 MDB 和 EJB 计时器。

  • 是 7.0
  • 爪哇 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. 自动装配跳过了一些 bean
  2. 有时 bean 不代理事务

第 1 项似乎与循环引用有关。我复制了一些有自动装配问题的 bean。我在同一个包中制作了副本。副本被连接起来,但不是原件。然后,我开始将 xml 上下文文件中的引用从原始文件移动到副本,并且在某些时候,副本不再连接,但原始文件会连接。我在其中一个上下文文件中有以下内容(更改了名称以保护我:):

<context:component-scan
    base-package="com.mycompany.package1,com.mycompany.package2" />

<context:annotation-config />

我认为第二个实体是多余的,但应该是无害的。

我在日志中看不到任何错误。我将日志记录转为调试,并看到大多数 bean 被自动装配,但这些 Spring 似乎没有任何错误跳过。

第 2 项可能与第 1 项相关。某些 bean 未正确代理以处理事务。在我的纯 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>

由于没有事务,我在某些地方遇到了休眠错误,而在其他地方,bean 被代理并开始事务。代理和非代理 bean 都在com.mycompany.package1.

当然,当我们在 WAS 中运行应用程序时,所有这些都有效。它使用 ContextSingletonBeanFactoryLocator。我在 JUnit 中也尝试过,但似乎没有帮助。

谢谢你的帮助。

4

1 回答 1

0

我认为你的测试类应该从:

AbstractTransactionalJUnit4SpringContextTests

然后您可以使用以下方式配置事务性内容:

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

其中 defaultRollback 定义是否在每次测试后回滚。

于 2011-06-29T15:29:04.483 回答