GraphUnit - 事务集成测试和回滚

sim*_*onl 3 neo4j graphaware spring-data-neo4j-4

我目前正在使用GraphUnit,Spock和正在进行的Neo4j服务器对我的Spring Data Neo4j 4.0支持的应用程序进行集成测试.

它一直在我的测试操作之后做的图形数据库的状态断言一个非常漂亮的工具,但我注意到,为了让GraphUnit的assertGraph,并printGraph告诉我我的期望,我Neo4j的交易必须首先承诺.从逻辑上讲,这对我来说很有意义,但这也意味着我无法标记我的集成测试,@Transactional并且在一次测试中对进程数据库所做的任何数据更改都会导致后续测试.

我通过在Spock fixture方法中的每个测试方法之后清除数据库来处理这个并且这很好但我非常希望能够:

  • 设置测试Neo4j数据集ONCE
  • 每次测试后,测试方法更改都会回滚
  • 仍然可以使用GraphUnit的断言和打印实用程序

我的问题是 - 有没有办法完成这三个?如果我想使用GraphUnit,它是一个基本要求/假设事务提交?

ATG*_*ATG 6

虽然您可以毫不费力地管理测试方法之间的Neo4j事务,但这里的棘手问题是让GraphUnit使用您的测试方法所参与的相同事务来进行断言.

鉴于GraphUnit需要您使用GraphDatabaseService,我最好的选择是为每个测试重新创建测试数据,我担心.

尽管如此,您可以通过使用可重用的JUnit测试规则来节省一些工作量,因为它减少了为每个测试工具编写拆卸方法的需要.在实现的类中,org.junit.rules.TestRule您可以GraphDatabaseService在其构造函数中设置一个,然后执行以下操作:

@Override
public Statement apply(final Statement baseStatement, Description description) {
    setUpTestData();

    return new Statement() {
        @Override
        public void evaluate() throws Throwable {
            try {
                if (graphDatabaseService.isAvailable(1000)) {
                    baseStatement.evaluate();
                } else {
                    Assert.fail("Database was shut down or didn't become available within 1s");
                }
            } finally {
                resetDatabase();
            }
        }
    };
}

public void setUpTestData() {
    // can set up common test data here, or just use an @Before method in the test harness
}

public void resetDatabase() {
    this.graphDatabaseService.execute("MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE r, n");
}
Run Code Online (Sandbox Code Playgroud)

你可以这样包括它:

public class ArbitraryTest {

    @Rule
    public final Neo4jTestRule neo4jRule = new Neo4jTestRule();

    @Test
    public void arbitraryTestMethod() {

        // some code...

        GraphUnit.assertSameGraph(sameGraphCypher, neo4jRule.getGraphDatabaseService());
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您将其作为静态包含,@ClassRule那么它将apply仅对整个测试类运行一次方法,这可能更有效但您必须在@Before/ @After方法中手动调用重置和设置方法来清理之间的事情.测试运行.