我们有一个现有的Java EE应用程序,它利用Spring并从xml配置过渡到自动装配。我们刚刚将大多数EJB转换为Spring bean,但目前仍然使用MDB和EJB计时器。
我也在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项有关。某些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中尝试过,但它似乎没有帮助。
感谢您的帮助。
答案 0 :(得分:0)
我认为您的测试类应该来自:
AbstractTransactionalJUnit4SpringContextTests
然后您可以使用以下命令配置事务性内容:
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
其中defaultRollback定义在每次测试后是否回滚。