首页 > 解决方案 > Neo4j程序测试和测试服务器

问题描述

我正在创建一个 Neo4J 程序来导入 RDF 数据。RDF 数据有一些复杂的结构信息,我编写了测试来涵盖每种情况(一些三元组创建标签、一些属性、一些关系......等等)。

这些过程是用 Kotlin 编写的。

它工作正常,实际上每个测试在单独执行时都会成功。但是当我一次运行整个测试用例时,我获得了一次成功,然后所有其他测试都失败了,但有以下例外:

org.neo4j.kernel.impl.core.ThreadToStatementContextBridge$BridgeDatabaseShutdownException: This database is shutdown.

我是 Neo4J 的新手,我很难找到好的例子,这里是一个测试用例的结构:

package mypackage

import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.neo4j.driver.internal.value.NullValue

import org.neo4j.driver.v1.Config
import org.neo4j.driver.v1.GraphDatabase
import org.neo4j.harness.junit.Neo4jRule

import java.io.File
import java.net.URI

class PropertyParserTest {

    // this rule starts a Neo4j instance
    @Rule
    @JvmField
    var neo4j: Neo4jRule = Neo4jRule()
            // This is the procedure/function to test
            .withProcedure(Mypackage::class.java)

    @Test
    @Throws(Throwable::class)
    fun shouldSetTheNameCorrectly() {

        GraphDatabase.driver(neo4j.boltURI(), Config.build().withoutEncryption().toConfig()).use({ driver ->
            driver.session().use({ session ->
                // Given
                val path: String = File("src/test/resources/test_rdf__1.ttl").getAbsolutePath()
                val testFile = File(path)
                val urlTestFile: URI = testFile.toURI()
                session.run("CALL mypackage.import('${urlTestFile}')")

                // When
                val result = session.run("MATCH (n) WHERE n:Person RETURN n.name as name")

                // Then
                var rec = result.next()
                Assert.assertEquals("Manuel, Niklaus (Niclaus)", rec.get("name").asString())
                rec = result?.next()
                Assert.assertEquals("Fischli / Weiss", rec.get("name").asString())
                rec = result?.next()
                Assert.assertEquals("Hodler, Ferdinand", rec.get("name").asString())
            })
        })
    }

    @Test
    @Throws(Throwable::class)
    fun shouldSetTheAlternateNameCorrectly() {

        GraphDatabase.driver(neo4j?.boltURI(), Config.build().withoutEncryption().toConfig()).use({ driver ->
            driver.session().use({ session ->
                // Given
                val path: String = File("src/test/resources/test_rdf_2.ttl").absolutePath
                val testFile = File(path)
                val urlTestFile: URI = testFile.toURI()
                session.run("CALL mypackage.import('${urlTestFile}')")

                // When
                val result = session.run("MATCH (n) WHERE n:Person RETURN n.name as name, n.alternate_names as alternate_names")

                // Then
                var rec = result.next()
                Assert.assertEquals("Holbein, Hans", rec.get("name").asString())
                var alternateNames = rec.get("alternate_names").asList()
                Assert.assertEquals(9, alternateNames.size)
                Assert.assertEquals("Holpenius, Joannes", alternateNames[0])
                Assert.assertEquals("Olpenius, Hans", alternateNames[8])

                rec = result.next()
                Assert.assertEquals("Manuel, Niklaus (Niclaus)", rec.get("name").asString())
                alternateNames = rec.get("alternate_names").asList()
                Assert.assertEquals(8, alternateNames.size)
                rec = result.next()
                Assert.assertEquals("Fischli / Weiss", rec.get("name").asString())
                Assert.assertTrue(rec.get("alternate_names") is NullValue)

                rec = result.next()
                Assert.assertEquals("Hodler, Ferdinand", rec.get("name").asString())
                Assert.assertTrue(rec.get("alternate_names") is NullValue)

                rec = result.next()
                Assert.assertEquals("Holbein", rec.get("name").asString())
                alternateNames = rec.get("alternate_names").asList()
                Assert.assertEquals(3, alternateNames.size)

            })
        })    
    }    
}

任何想法 ?我使用这个代码库作为起点:https ://github.com/jbarrasa/neosemantics/blob/3.3/src/test/java/semantics/RDFImportTest.java

标签: testingneo4jkotlin

解决方案


好的,我实际上在我的程序中发现了一个在事务之外执行的代码,我认为这可能是问题的原因。当我将所有内容分组到一个事务中时,我不再有这个问题了。

我不完全确定为什么它适用于单个测试并且在运行整个测试用例时会失败,但是现在可以了。


推荐阅读