0

我正在使用 maven 和 spring boot 1.5 编写一个多模块项目。我的主模块的 pom 文件在测试范围内引用了另一个提供我们所有模拟类的模块。模拟模块仅用于本地测试,因此它不会生产,但它有自己的@Entity类,并且配置为使用spring.jpa.hibernate.ddl-auto: validate. 在我的主模块中,我虽然有@Entity类和配置来使用相同的属性自动创建它们。现在在我的主模块的一些测试中,我收到错误消息,即 spring jpa 找不到@Entity类位于模拟模块中的表。我收到这样的错误:

java.lang.IllegalStateException:无法加载 ApplicationContext

    在 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
    在 org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
    在 org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
    在 org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
    在 org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
    在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    在 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    在 org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    在 org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    在 org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    在 com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
原因:org.springframework.beans.factory.BeanCreationException:创建类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]中定义的名称为“entityManagerFactory”的bean时出错:调用init方法失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081)
    在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856)
    在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
    在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
    在 org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
    在 org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
    在 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
    在 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
    ... 24 更多
引起:javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建Hibernate SessionFactory
    在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
    在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
    在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
    在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
    在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 39 更多
引起:org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [mock_entity]
    在 org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:67)
    在 org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50)
    在 org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91)
    在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:475)
    在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
    在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
    ... 45 更多

它总是告诉我它错过了桌子mock_entity

我正在执行的测试是集成测试。像这样的东西:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainModule.class)
@ActiveProfiles( {"default", "development", "integration"})
public class IntegrationTestMainModule {}

MainModule.class是我用@SpringBootApplication.

感谢您的帮助。

4

1 回答 1

1

spring.jpa.hibernate.ddl-auto我通过将属性设置none为特定测试暂时解决了问题。

于 2018-05-09T09:19:50.953 回答