gpt4 book ai didi

Spring JUnit 测试 : Autowiring and Transaction Problems

转载 作者:行者123 更新时间:2023-12-05 01:19:03 26 4
gpt4 key购买 nike

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

  • 是 7.0
  • Java 6
  • Spring 3.0.5
  • JUnit 4.8.1

我也在用 JUnit 编写集成测试。我的集成测试使用大部分上下文配置文件,就像在 WAS 中运行时一样,但没有绑定(bind)到 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. Autowiring 会跳过一些 beans
  2. 有时 beans 不代理事务

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

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

<context:annotation-config />

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

我在日志中没有看到任何错误。我将日志记录转为调试并看到大多数 bean 被 Autowiring ,但是那些 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>

我在某些地方出现休眠错误,因为没有事务,而在其他地方,bean 被代理并启动了事务。代理和非代理 bean 都在 com.mycompany.package1 的子包中。

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

感谢您的帮助。

最佳答案

我认为你的测试类应该扩展自:

AbstractTransactionalJUnit4SpringContextTests

然后你可以配置交易的东西:

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

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

关于Spring JUnit 测试 : Autowiring and Transaction Problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4714971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com