虽然您可以毫不费力地管理测试方法之间的 Neo4j 事务,但这里的棘手之处在于让 GraphUnit 使用您的测试方法参与的相同事务进行断言。
鉴于 GraphUnit 需要您使用GraphDatabaseService
,恐怕您最好的选择确实是为每个测试重新创建您的测试数据。
尽管如此,您可以通过使用可重用的 JUnit 测试规则来节省一些精力,因为它减少了为每个测试工具编写拆卸方法的需要。在实现的类中org.junit.rules.TestRule
,您可以在其构造函数中设置 a 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");
}
您可以像这样包含它:
public class ArbitraryTest {
@Rule
public final Neo4jTestRule neo4jRule = new Neo4jTestRule();
@Test
public void arbitraryTestMethod() {
// some code...
GraphUnit.assertSameGraph(sameGraphCypher, neo4jRule.getGraphDatabaseService());
}
}
请注意,如果您将它作为静态包含,@ClassRule
那么它只会为整个测试类运行该apply
方法一次,这可能会更有效,但您必须在@Before
/@After
方法中手动调用重置和设置方法来清理它们之间的内容试运行。