1

Spring 2.5 と hibernate 3 に基づく Web アプリを開発しています。最近、JUnit テストを導入し、DBUnit フレームワークを使用していくつかの統合テストを行いました。DBUnit は、あるテストと別のテストの間に xml データセットを使用してデータベースを更新することになっていますが、私が見たようにうまく機能しています。

ただし、テストで要素を更新すると、休止状態がこの情報をキャッチするように見え、次のテストで要素をロードしても、その情報は私が変更したものです。実行が一時停止されているときに DB を見ると、データベースは DBUnit によって適切にリセットされます。したがって、Hibernateの問題である可能性があると思います..

春のコンテキストに新しい休止状態セッションが必要だと言って、テスト間でティアダウンを行う方法はありますか? ところで、私は Spring アノテーションを使用しておらず、Spring コンテキストをコードで取得しています。

String[] contextLocations = new String[2];
contextLocations[0] = "WebContent/WEB-INF/applicationContext.xml";
contextLocations[1] = "src/System_V3/test/applicationContext.xml";
context = new FileSystemXmlApplicationContext(contextLocations);

DBUnit セットアップ:

@Before
public void setUpBeforeClass() throws Exception {
    handleSetUpOperation();
}

private static void handleSetUpOperation() throws Exception {
    conn = getConnection();
    conn.getConnection().setAutoCommit(false);
    final IDataSet data = getDataSet();
    try {
        DatabaseOperation.REFRESH.execute(conn, data);
    } finally {
        conn.close();
    }
}

private static IDatabaseConnection getConnection() throws ClassNotFoundException, SQLException,
        DatabaseUnitException {
    Class.forName("org.gjt.mm.mysql.Driver");
    return new DatabaseConnection(DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/web_database", "root", "pass"));
}

private static IDataSet getDataSet() throws IOException, DataSetException {
    ClassLoader classLoader = TestPrueba.class.getClassLoader();
    return new FlatXmlDataSetBuilder().build(classLoader
            .getResourceAsStream("System_V3/test/dataset.xml"));
}

テストは @Test アノテーションのみを使用して JUnit 4 で実行され、テスト クラスはライブラリ クラスを拡張しません。

なにか提案を?

4

2 に答える 2

3

これがあなたを助けることができるものであるかどうかはわかりませんが、念のために...

session.clear()を使用して、ティアダウンメソッドで使用してみてください。こちらをご覧くださいhttp://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#clear()

仕様に従ってsession.clear()->セッションを完全にクリアします。ロードされたすべてのインスタンスを削除し、保留中のすべての保存、更新、および削除をキャンセルします。開いているイテレータまたはScrollableResultsのインスタンスを閉じないでください。

于 2012-07-26T11:35:52.950 に答える
1

トランザクション内でテストを実行する必要があります。これは、テストにSpringJUnit4ClassRunnerを設定することで実現できます。@Transactionalこれが構成された後、テストごとに注釈を使用できます。

このアプローチを使用する@Autowiredと、Bean をテストに直接渡すこともできます。

例えば:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-file.xml" })
public class MyTest {

    @Autowired
    private MyService myService;

    @Transactional
    @Test
    private void myFirstTest() {
        ...
        myService.executeSomething();
        ...
    }

}

もちろん、テストクラスでデフォルトの動作をRollBackに設定して、それに注釈を付けることができます@TransactionConfiguration(defaultRollback = true/false)

于 2012-07-26T11:31:43.460 に答える