【问题标题】:ApplicationContext created in multiple threads when running tests with Maven使用 Maven 运行测试时在多个线程中创建的 ApplicationContext
【发布时间】:2012-10-12 12:47:53
【问题描述】:

我有两个persistence-units,除了其他使用Hibernate的hbm2ddl create-drop和其他使用validate之外,它们是相同的,并且数据库是由liquiBase创建的。

现在从 Eclipse 运行任何测试(名为 in-mem db 的 HSQLDB),它们工作正常。但是从 maven 运行它们,它们会因奇怪的外键违规而刹车。

我认为奇怪的是,我从 4 个不同的线程收到消息,例如关闭其中一个持久性单元时发生,而表丢弃仍写入控制台。

为什么我会得到四个线程,它们都有自己的 ApplicationContexts?我没有为surefire设置parallel参数,我也没有为maven使用-T开关。

编辑:

这是来自 Maven 命令行输出的 sn-p

Hibernate: drop table PostalCodeDistribution if exists
Hibernate: drop table PublicationAudit if exists
15:21:13.672 [Thread-2] INFO  org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'TestPU-nocreate'
Hibernate: drop table PostalCodeDistributionAudit if exists
Hibernate: drop table PublicationInvoicing if exists
Hibernate: drop table PostalCodeSubscriberCountAudit if exists
15:21:13.672 [Thread-2] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000030: Cleaning up connection pool [jdbc:hsqldb:mem:ptptest]
Hibernate: drop table Revision if exists
Hibernate: drop table PriceDate if exists

【问题讨论】:

    标签: spring hibernate maven junit liquibase


    【解决方案1】:

    您可能知道,默认情况下,SureFire 在不同的线程(“fork”)中执行您的测试。见:Does Maven surefire plugin run tests using multiple threads?

    您的测试或您的测试使用的某些库很可能是异步执行的。您应该检查您的测试以验证是否是这种情况。

    【讨论】:

    • 我认为这并不能真正回答问题。
    • 好吧,没有关于测试配置和应用程序代码的更多细节,还有什么可以提供的? @vertti 需要跟进包含线程名称或更多详细信息的日志。请注意,没有其他人提供答案。
    • 好吧,我们可以描述一下 JPA 持久性上下文相关测试在春季是如何工作的:应用程序上下文的预期重用策略是什么以及对它有什么贡献。有四种不同的上下文是否正常?或不?为什么?
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2012-04-23
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多