2016-04-24 18 views
1

ローカルのsqliteデータベースでquery/insert/update/deleteを処理するContentProviderを作成しました。私はテストのカップルを書いたテストのためAndroid Content Providerの異常な動作のテスト

TestMovieContract.java : for testing MovieContract class 
TestMovieDBHelper.java : for testing MovieDBHelper class 
TestUriMatcher.java : for testing UriMatcher inside MovieContentProvider class 
TestProvider.java  : for testing MovieContentProvider class 

私は別にこれらのテストのそれぞれを実行すると、それらはすべて渡されますが、私はそれらのすべてを実行したときのテストの一つが故障しました。それが失敗したassert文は次のとおりです。

04-24 19:16:00.086 6938-6963/com.example.android.popularmovies.app I/TestRunner: started: testAndroidTestCaseSetupProperly(com.example.android.popularmovies.app.data.TestProvider) 
04-24 19:16:00.104 6938-6963/com.example.android.popularmovies.app I/TestRunner: finished: testAndroidTestCaseSetupProperly(com.example.android.popularmovies.app.data.TestProvider) 
04-24 19:16:00.104 6938-6963/com.example.android.popularmovies.app I/TestRunner: passed: testAndroidTestCaseSetupProperly(com.example.android.popularmovies.app.data.TestProvider) 
04-24 19:16:00.104 6938-6963/com.example.android.popularmovies.app I/TestRunner: started: testDelete(com.example.android.popularmovies.app.data.TestProvider) 
04-24 19:16:00.122 6938-6963/? E/SQLiteLog: (1032) statement aborts at 33: [INSERT INTO movie(popularity,vote_average,original_title,backdrop_url,movie_id,original_lang,image_url,overview,title,is_adult,release_date,vote_count,is_favorite,genre_ids) VALUES (?, 
04-24 19:16:00.122 6938-6963/? E/SQLiteDatabase: Error inserting popularity=8.3 vote_average=5.2 original_title=Some Android backdrop_url=http://mybackimage.com/44.png movie_id=40443 original_lang=en image_url=http://someimage.com/33.jpg overview=This is a sample overview title=Very First Android is_adult=true release_date=2015-05-23 vote_count=33345 is_favorite=true genre_ids=23,1,5 
               android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032) 
                at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
                at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780) 
                at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
                at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 
                at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471) 
                at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) 
                at com.example.android.popularmovies.app.data.MovieContentProvider.insert(MovieContentProvider.java:197) 
                at android.content.ContentProvider$Transport.insert(ContentProvider.java:263) 
                at android.content.ContentResolver.insert(ContentResolver.java:1231) 
                at com.example.android.popularmovies.app.data.TestProvider.testDelete(TestProvider.java:308) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at junit.framework.TestCase.runTest(TestCase.java:168) 
                at junit.framework.TestCase.runBare(TestCase.java:134) 
                at junit.framework.TestResult$1.protect(TestResult.java:115) 
                at junit.framework.TestResult.runProtected(TestResult.java:133) 
                at junit.framework.TestResult.run(TestResult.java:118) 
                at junit.framework.TestCase.run(TestCase.java:124) 
                at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
                at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
                at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
                at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879) 
04-24 19:16:00.122 6938-6963/? W/SQLiteLog: (28) file unlinked while open: /data/user/0/com.example.android.popularmovies.app/databases/movie.db 

私が思うに、このログの最後に警告があります:

returnedUri = mContext.getContentResolver().insert(
     movieInsertUri, 
     sampleMovieValues 
); 

assertNotNull("the values have not been inserted into " + MovieContract.MovieEntry.TABLE_NAME, returnedUri); 

私は、この特定のテストを実行するとき、私は例外を見たlogcatをチェックするとは重要。リンクされていないデータベースファイルを示します。私はすべてのコードをチェックして、データベース接続が正常に終了したことを確認しました。

私の質問は、なぜ私がTestProvider.javaを実行したときにテストに合格するのですが、それらのすべてを実行すると失敗しますか?どのように私はそれを解決することができますか?

UPDATE

私は私のアサートが失敗したエリアに小さな変更を加えたし、INSERT文をクローン化しました。新しいコードは次のようになります。

returnedUri = mContext.getContentResolver().insert(
     movieInsertUri, 
     sampleMovieValues 
); 

returnedUri = mContext.getContentResolver().insert(
     movieInsertUri, 
     sampleMovieValues 
); 

assertNotNull("the values have not been inserted into " + MovieContract.MovieEntry.TABLE_NAME, returnedUri); 

驚くべきことに、すべてのテストが合格し、ボンネットの下に何か問題が多分あると思うために私を導いています。誰かがあなたはContentProviderの上のテストメソッドを呼び出すときのContentProviderの複数のインスタンスで、」ContentProvider.shutdown();

を使用することができます

+0

エミュレータまたはリアルデバイスを使用していますか?それは根付いているのだろうか?どれくらいの記憶がありますか? –

+0

@ MaximGは1Gメモリでエミュレートされています – Pooya

答えて

0

問題をこれを考え出すに私を助けることができる場合、私は感謝し、しかし、ContentProviderのインスタンスが起動され、後に実行し続けていますたとえ後続のテストが別のContentProviderをインスタンス化してもテストは終了します.2つのインスタンスが通常同じ基本データソース(たとえばsqliteデータベース)に対して実行されているため、競合が発生します。

例:マキシムGが言及しているよう

@Override 
@TargetApi(11) 
public void shutdown() { 
    mOpenHelper.close(); 
    super.shutdown(); 
} 
+0

コンテンツプロバイダクラスにシャットダウンのオーバーライドがあります。 – Pooya

+0

私はシャットダウンメソッドを実装しましたが、私のテストでは、コンテンツプロバイダインスタンスにシャットダウン()を明示的に呼び出すアクセス権がありません – Pooya

+0

tearDown()メソッドでコールを追加しようとしました。 –

1

実装シャットダウン()は、問題の世話をしない、しかし、あなたはあなたのコードは、各テストでそれを呼び出すことを確認する必要があります。難しい部分は、ContentResolverを介してContentProviderにアクセスすることです。

 mContext.getContentResolver() 
      .acquireContentProviderClient(uri) 
      .getLocalContentProvider() 
      .shutdown(); 

これは、コンテンツプロバイダが外部でない限り動作します。

関連する問題