Spring JUnit测试:自动装配和交易问题

时间:2011-01-17 15:39:22

标签: spring junit autowired

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

  • WAS 7.0
  • Java 6
  • Spring 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. 有时,bean不代理交易
  3. 第1项似乎与循环引用有关。我制作了一些有自动装配问题的豆子的副本。我在同一个包中制作了副本。该副本已连线,但不是原件。然后我开始将xml上下文文件中的引用从原始文件移动到副本,并且在某些时候,副本不再连接而原始文件也是如此。我在其中一个上下文文件中有以下内容(更改名称以保护我:):

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

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

    我没有在日志中看到任何错误。我将日志记录调试并看到大多数bean都是自动装配的,但是那些Spring上没有错误似乎跳过了。

    第2项可能与第1项有关。某些bean未正确代理以处理事务。在我的JUnit-only上下文中,我有以下内容:

    <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>
    

    我在某些地方遇到了hibernate错误,因为没有事务,而在其他地方,bean被代理并且事务已经启动。代理和非代理bean都在com.mycompany.package1的子包中。

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

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您的测试类应该来自:

AbstractTransactionalJUnit4SpringContextTests

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

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

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