Spring Data Neo4j:TransactionException:在集成测试

时间:2017-11-16 18:04:30

标签: spring neo4j integration-testing spring-data-neo4j spring-data-neo4j-4

我使用Spring Data Neo4j 4.x(带有嵌入式数据库)进行了一组有效的集成测试。为了激活它,我定义了一个名为integrationTest的配置文件,我通过@ActiveProfiles("integrationTest")在相关测试中激活(虽然这被提取到元注释中)。

所有集成测试都驻留在单独的源集(integrationTest)中,并在构建中单独运行。它们不与常规测试混合。在该源集内,所有测试到目前为止仅使用integrationTest配置文件。

我现在有了新的要求:有些测试应该使用服务的另一种实现而不是默认。为此,我定义了另一个配置文件(我们称之为otherProfile),该配置文件除了integrationTest配置文件(即@ActiveProfiles({"integrationTest", "otherProfile"}))之外已激活。

运行单个测试时,工作正常。但是,当连续运行多个/所有测试时,这开始失败,并出现以下异常:

  

2017-11-16 18:32:27,042 W [main](EmbeddedTransaction.java:64)交易已经关闭   2017-11-16 18:32:27,043 E [main](TransactionAspectSupport.java:530)由回滚异常覆盖的应用程序异常   java.lang.RuntimeException:org.neo4j.ogm.exception.TransactionException:事务已经关闭       at org.neo4j.ogm.drivers.embedded.request.EmbeddedRequest.executeRequest(EmbeddedRequest.java:180)       at org.neo4j.ogm.drivers.embedded.request.EmbeddedRequest.execute(EmbeddedRequest.java:74)       在org.neo4j.ogm.session.delegates.DeleteDelegate.purgeDatabase(DeleteDelegate.java:265)       在org.neo4j.ogm.session.Neo4jSession.purgeDatabase(Neo4jSession.java:417)       at sun.reflect.GeneratedMethodAccessor228.invoke(Unknown Source)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       at java.lang.reflect.Method.invoke(Method.java:498)       在org.springframework.data.neo4j.transaction.SharedSessionCreator $ SharedSessionInvocationHandler.invoke(SharedSessionCreator.java:131)       at com.sun.proxy。$ Proxy143.purgeDatabase(Unknown Source)       at de.moneysoft.core.util.testUtil.GraphDatabaseCleanerService.cleanUp(GraphDatabaseCleanerService.java:53)       at de.moneysoft.core.util.testUtil.GraphDatabaseCleanerService $$ FastClassBySpringCGLIB $$ a273583c.invoke()       在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)       在org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)       at org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:99)       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)       在org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)       at de.moneysoft.core.util.testUtil.GraphDatabaseCleanerService $$ EnhancerBySpringCGLIB $$ a1e0845a.cleanUp()       在de.moneysoft.core.util.testUtil.GraphDatabaseCleanerRule.cleanUp(GraphDatabaseCleanerRule.java:42)       at de.moneysoft.core.util.testUtil.GraphDatabaseCleanerRule.after(GraphDatabaseCleanerRule.java:37)       at org.junit.rules.ExternalResource $ 1.evaluate(ExternalResource.java:50)       在org.junit.rules.ExternalResource $ 1.evaluate(ExternalResource.java:48)       在org.junit.rules.RunRules.evaluate(RunRules.java:20)       在org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)       在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)       在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)       在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.runners.Suite.runChild(Suite.java:128)       在org.junit.runners.Suite.runChild(Suite.java:27)       在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.junit.runners.ParentRunner.run(ParentRunner.java:363)       在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.neo4j.ogm.exception.TransactionException:事务已经关闭       at org.neo4j.ogm.drivers.embedded.request.EmbeddedRequest.executeRequest(EmbeddedRequest.java:166)       ...省略了50个常见帧

从IDE运行以及从gradle运行时都会发生这种情况。 GraphDatabaseCleanerRule本身似乎没有错:在其他情况下,它只是第一次与neo4j的交互失败。

经过一些调试后,我发现在切换配置文件失败后,它始终是第一次测试。我知道Spring使用活动配置文件(以及其他内容)以便在测试之间缓存应用程序上下文。我可以看到使用第二个配置文件的第一个测试导致(部分?)重新启动应用程序上下文。

我猜错误来自于与同一嵌入式neo4j实例的第二次连接,因为前一个上下文中的一个未关闭。我不知道在切换配置文件时关闭连接的任何钩子(有问题的服务没有被破坏,因此@PreDestroy没有帮助。对于这个例外,没有太多解释可以找到。我为事务添加了调试日志记录,但它们似乎表明没有重用旧事务......

我尝试添加@DirtiesContext(课前和课后模式)但没有成功。我不确定这是一个(弹簧数据)neo4j问题还是只是一个弹簧问题。关于如何解决或解决这个问题的任何建议?

编辑:我使用的是Spring Data Neo4j 4.2.4.RELEASE,现在更新为4.2.8.RELEASE,但问题仍然存在。 澄清一下:所有测试单独运行时运行良好。仅使用一个配置文件运行测试或仅使用其他配置文件运行测试也可以正常工作。只有当执行两个配置文件的测试时,才会发生错误。

编辑2:为了完整性,这就是提到的元注释激活不同配置文件的方式:

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@ActiveProfiles({"integrationTest"})
@SpringBootTest(properties = "some.property=2000")
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = TestConfiguration.class)
public @interface Neo4jIntegrationTest
{

}

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@ActiveProfiles({"integrationTest", "otherProfile"})
@SpringBootTest(properties = "some.property=2000")
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = TestConfiguration.class)
public @interface OtherNeo4jIntegrationTest
{
}

0 个答案:

没有答案