Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试失败-抱怨刚刚插入的数据丢失_Java_Spring_Transactions_Ibatis - Fatal编程技术网

Java JUnit测试失败-抱怨刚刚插入的数据丢失

Java JUnit测试失败-抱怨刚刚插入的数据丢失,java,spring,transactions,ibatis,Java,Spring,Transactions,Ibatis,我在JUnit测试中遇到了一个非常奇怪的问题,我似乎无法确定。我有一个具有相当标准结构(DAO、服务类别等)的多模块JavaWebApp项目。在这个项目中,我有一个“核心”项目,它包含一些抽象的设置代码,可以插入一个测试用户以及用户所需的项目(在这种情况下是一个“企业”,因此用户必须属于一个企业,这是在数据库级别强制执行的) 到目前为止相当简单。。。但这就是奇怪的开始 一些测试无法运行并引发数据库异常,其中它抱怨由于企业不存在而无法插入用户。但它只是在前一行代码中创建了企业!企业号的插入没有错误

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

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

  • 一些测试无法运行并引发数据库异常,其中它抱怨由于企业不存在而无法插入用户。但它只是在前一行代码中创建了企业!企业号的插入没有错误
  • 更奇怪的是,如果这个测试类是自己运行的,那么一切都很好。只有当测试作为项目的一部分运行时,它才会失败
  • 同样的抽象代码在失败之前经过了10多次测试
  • f
  • 我已经用这个把头撞在墙上好几天了,还没有真正取得任何进展。我甚至不知道该提供什么信息来帮助诊断

    • 使用JUnit4.4、Spring 2.5.6、iBatis 2.3.0、Postgresql 8.3
    • 从org.apache.commons.dbcp.BasicDataSource切换到org.springframework.jdbc.datasource.driverManager数据源改变了问题。使用DriverManager数据源,测试第一次工作,但是现在突然有很多数据没有回滚到数据库中!它把一切都抛在脑后。一切顺利
    • 通过Eclipse和Maven运行时测试失败
    请询问任何可能帮助我解决问题的信息

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


      • 这是一个很难解决的问题,但我将根据您提供的详细信息进行粗略猜测

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

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

        进一步的假设(好吧,可以说它已经结束了,试试胡乱猜测),某个东西(在源代码中或者更可能是您自己的框架代码中)调用终结器中事务的回滚。这就是为什么它工作了10多次,然后失败了,并且只是作为项目的一部分-正是该运行在该点触发垃圾收集,导致事务回滚,导致新行代码启动一个新事务,记录处于无效状态

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

        进一步编辑:我所说的调用close的终结器是这样的:

         public class SomeConnectionWrapper {
              private Connection dbConnection;
        
              protected void finalize() {
                   dbConnection.close();
              }
         }
        

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

        那么。。。我似乎偶然发现了这个问题的解决办法,尽管我真的不知道它到底是什么。我通过移动所有测试,然后逐个恢复来重建测试。很低,直到我添加了最后一个测试类,问题才再次出现

        该测试类从一个基本测试类扩展而来,该测试类定义了所有与Spring相关的设置注释,如@RunWith和@ContextConfiguration。出于某种原因,这个测试类重新定义了@RunWith和@ContextConfiguration属性,当我删除它们时,一切又开始工作了。这个测试类的另一个奇怪之处是,我在其中的每个测试上都使用了@Ignore(它包含一些旧的测试)


        所以。。。如果有人遇到这个奇怪的问题,您可以尝试删除额外的注释来修复它

        我在使用Junit4和spring时遇到了类似的问题。
        我必须在测试方法中添加@Transactional,以便在提交之前从数据库中读回内容。

        您能在失败点检查数据库吗?它实际上有企业的记录吗?你能给出你的db模型吗?谢谢你的帮助。事务如何可能在没有触发回滚的情况下回滚?i、 e.没有任何错误,我没有触发回滚。我刚刚将日志记录增加到最大值,我可以看到这个测试失败和另一个测试失败之间只有一个区别。我将把这些结果发布在minute@Collin,正如我所说,我在胡乱猜测的领域。回滚可以通过两种方式触发:关闭设置为
        autocommit:false的数据库连接或显式回滚。我会查一下你的鳕鱼