【问题标题】:junit test case transaction not getting committed - no errorsjunit 测试用例事务未提交 - 没有错误
【发布时间】:2011-03-30 19:34:39
【问题描述】:

我们在我们的应用程序中实现了 JUnit4,它使用 Spring 核心和 JPA 和 DB2。 我们需要测试从一个数据库检索数据并合并到另一个数据库的完整功能。

编写了从第一个数据库中检索数据的测试用例,它运行良好,没有任何错误,但记录没有存储到第二个数据库中。

实施

TestCase 类我们已经包含了以下注解,以使测试用例在必要时在事务下运行,

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
      DependencyInjectionTestExecutionListener.class,    
      TransactionalTestExecutionListener.class})
@ContextConfiguration(locations={""})
@TransactionConfiguration(transactionManager="defaultTransactionManager", defaultRollback=false)
@Transactional

在应用程序中,我们有一个管理器类来使用 doSynch() 方法执行此操作。从该方法 crudHelper 类的 txStore() 方法将被调用以初始化并调用 doStore() 方法(在同一类中)以将实体合并到数据库。

以下是贯穿整个测试用例逻辑的事务性声明

TestCase testSynch() - @Transactional(propagation=Propagation.SUPPORTS)
Manager doSynch() - @Transactional(propagation=Propagation.NEVER)
CRUDHelper txStore() - @Transactional(propagation=Propagation.REQUIRED)
           doStore() - No Transactional annotation

doSynch() 被标记为 NEVER,因为此时它不需要任何事务,并且在 CRUDHelper 等其他级别中,事务可以标记为 REQUIRED 以确保事务可用。

问题

在这里,当我们运行调用 Manager 的 doSynch() 方法来测试功能的测试用例时,除了没有合并记录并且没有抛出错误之外,完整的流程运行良好。

当从 JSP 调用 Manager 方法时效果很好。 我们还通过直接从测试用例调用 txStore() 进行了测试,它也可以正常工作。

请让我们知道事务管理是否不正确,或者解决此问题会有更大的帮助。如果问题或环境不清楚,请更新我。提前致谢!!

【问题讨论】:

    标签: spring jpa junit4 transactional


    【解决方案1】:

    您是否使用@Rollback 注释标记您的方法?

    来自JavaDoc

    测试注释以指示是否 不是注释的事务 测试方法应该回滚 测试方法完成后。 如果为真,交易将是 回滚;否则, 事务将被提交。

    【讨论】:

    • 感谢您的 4 回复。我们在 TestCase 类级别将 defaultRollback 值设置为 false,并且没有为方法级别提供任何其他回滚。但唯一的工作方式是将 @Transactional 添加到 doStore() 方法。我们能够看到仅在这种情况下打印插入查询,并且在调用 em.merge() 时,doStore 的注释被删除,甚至没有打印单个插入查询。但是我们不能像在我们冻结的框架类中那样做这种改变。任何帮助都将是可观的。!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2019-04-03
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多