2017-08-15 13 views
1

私たちのアプリケーションでは、 "ミラーテーブル"(ほぼ同じテーブルのペア)があり、アプリケーションのロジックをテストしてそのミラーテーブルに適切な方法で書き込みを行う必要があります。データベースレベルでしかテストできないように見えます。メソッドの作業結果がデータベースに正しく書き込まれているかどうかをチェックしたいと考えています。 @BeforeClassメソッドで外部トランザクションを開始し、テストケースで作成およびクローズされたネストされたトランザクションにいくつかの変更を加えることができると考えました。したがって、すべてのテストケースで、データベースにロードされた同じ基本データセットと、私たちはちょうどネストされたトランザクションをロールバックします。もちろん、@AfterClassメソッドで外部トランザクションを終了すると、アプリケーションのデータベースに変更が反映されません。AndroidのSQLiteネストされたトランザクションのテスト

Androidはネストされた取引を正しくサポートしていないため、達成できないようです。this answerを参照してください。

多分、データベースに影響を与えずにこの動作をテストする方法がありますか?または、ネストされたトランザクションの回避策がありますか?

ありがとうございます!

+0

Androidのデータベースフレームワークのサポートがうまく入れ子になっています。あなたは他の答えを正しく読まなかった。 –

+0

ネストされたトランザクションは、期待どおりロールバックされません。私はテストしました。たぶん私は何かを逃した... – fobo66

+0

任意の(外側またはネストされた)トランザクションが成功しない場合、トランザクション全体がロールバックされます。それは何が間違っていますか? –

答えて

0

Android database frameworkは、内部トランザクションのSQL文を抑制することによってのみネストされたトランザクションを実装します。外部トランザクションまたはネストされたトランザクションが成功しない場合は、一番外側のトランザクションをロールバックします。

トランザクションとセーブポイントは、セマンティクスが異なります。セーブポイントにロールバックする場合は、実際にはsavepoint statementsを使用する必要があります。 Androidでは、フレームワークのbeginTransaction()などの呼び出しを避け、セーブポイントSQL文を直接実行する必要があります。つまり、テストされたコードで独自のデータベースフレームワークが使用されていることを確認する必要があります。

関連する問題