gpt4 book ai didi

java - JUnit 测试失败 - 提示缺少刚刚插入的数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:41:12 30 4
gpt4 key购买 nike

我的 JUnit 测试中有一个非常奇怪的问题,我似乎无法确定。我有一个具有相当标准结构(DAO、服务类等)的多模块 java webapp 项目。在这个项目中,我有一个“核心”项目,其中包含一些抽象的设置代码,它插入一个测试用户以及用户的必要项目(在这种情况下是一个“企业”,所以用户必须属于一个企业,这是强制执行的在数据库级别)

到目前为止相当简单......但这里是奇怪的开始

  1. 一些测试无法运行并抛出数据库异常,提示无法插入用户,因为企业不存在。但它只是在前面的代码行中创建了企业!而且企业的插入也没有错误。
  2. 还奇怪,如果这个测试类自己运行,一切正常。只有当测试作为项目的一部分运行时才会失败!
  3. 在失败之前,经过 10 多次测试运行了完全相同的抽象代码!
  4. f

这几天我一直在用头撞墙,但没有取得任何进展。我什至不确定提供什么信息来帮助诊断这个问题。

  • 使用 JUnit 4.4、Spring 2.5.6、iBatis 2.3.0、Postgresql 8.3
  • 从 org.apache.commons.dbcp.BasicDataSource 切换到 org.springframework.jdbc.datasource.DriverManagerDataSource 改变了问题。使用 DriverManagerDataSource 测试第一次成功,但现在突然之间数据库中的大量数据没有回滚!它把一切都抛在脑后。全部没有错误
  • 通过 Eclipse 和 Maven 运行时测试失败

请询问任何可以帮助我解决问题的信息!

更新:我已将日志记录调到最大。这个失败的测试和另一个成功的测试之间只有一点点区别。突出显示了差异。错误发生后,我看到许多“Creating [java.util.concurrent.ConcurrentHashMap]”行,然后错误处理代码开始

最佳答案

这是一个很难在 SO 上解决的问题,但我将根据您提供的详细信息进行大胆的猜测。

假设:测试中的插入都发生在事务中,事务被回滚。 (这就是 BasicDataSource 保持数据库干净的原因——它在最后回滚)。当这种情况停止发生时(通过使用 DriverManagerDataSource),测试通过但数据库不会回滚。

这表明即使“它只是在前面的代码行中创建了企业!”可以回滚事务以删除记录。

进一步的假设(好吧,过度陈述,尝试大胆猜测),某些东西(在 BasicDataSource 或更可能是您自己的框架代码中)在终结器中调用事务的回滚。这就是为什么它工作了 10 多次然后失败了,并且只作为项目的一部分——正是那个运行在那个时候触发了垃圾收集,导致事务回滚,导致新的代码行开始一个新的事务记录处于无效状态。

编辑:从您的编辑来看,似乎由于某种原因在失败的测试中您获得了一个新的数据库连接。这符合我上面的场景,但也可以通过说明由于某种原因在代码中的那个点当测试作为整个项目的一部分运行时获得一个新事务来解释。新事务看不到发生在不同事务中的企业记录的插入,事务保持打开和未提交状态。对此进行测试的一种方法是将此运行的事务隔离级别设置为最大,这样当企业表上有事务时,没有任何东西可以扫描它。如果这种情况是正确的,那么您的代码就会死锁。

进一步编辑:我所说的调用关闭的终结器的意思是这样的:

 public class SomeConnectionWrapper {
private Connection dbConnection;

protected void finalize() {
dbConnection.close();
}
}

如果 SomeConnectionWrapper 被垃圾回收并且连接关闭,您的数据库连接池将返回一个不同的连接。

关于java - JUnit 测试失败 - 提示缺少刚刚插入的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945433/

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