2017-01-14 18 views
-1

私は自分のコンテンツプロバイダの簡単なテストを書いています。問題は、実動データを使用しているテストを実行するときです。ライブアプリデータから別のテストデータを使用するにはどうすればよいですか?ContentProviderテスト - 生産とテストデータの分離

@RunWith(AndroidJUnit4.class) 
public class MyContentProviderTest extends ProviderTestCase2<MyContentProvider>{ 
    public MyContentProviderTest() { 
     super(MyContentProvider.class, MyContentProvider.AUTHORITY); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     setContext(InstrumentationRegistry.getContext()); 
     //have also tried with setContext(InstrumentationRegistry.getTargetContext()); 
     super.setUp(); 
    } 

    @Test 
    public void insertTest(){ 
     ContentResolver contentResolver = getContext().getContentResolver(); 
     assertNotNull(contentResolver); 

     contentResolver.insert(MyContentProvider.uri,createContentValues()); 
     Cursor cursor = contentResolver.query(MyContentProvider.uri, Database.ALL_COLUMNS, 
      null, null, null); 

     assertNotNull(cursor); 

     // the test fails here because along with the row inserted above, there are also many more rows of data from using my app normally (not while under test). 
     assertEquals(1, cursor.getCount()); 

     //todo: verify cursor contents 
     cursor.close(); 
    } 

    ContentValues createContentValues(){ 
     ContentValues cv = new ContentValues(); 
     cv.put(Database.COLUMN_DATETIME, LocalDateTime.now().format(Util.DATE_FORMAT)); 
      /* ... etc */ 
     return cv; 
    } 
} 
+0

アーカイブしようとしているものがありませんか? – creativecreatorormaybenot

+0

'MyContentProvider.uri'は本当の生産物' Uri'ですか? – CommonsWare

+0

@CommonsWare、そうです。 MyContentProviderのメンバー変数として、別のURIを使用する必要がありますか? – Stephen

答えて

1

私は別のURIを使用すべきですか?

はい。あなたのテストコードがプロダクションプロバイダを襲っています。別のテストプロバイダにヒットするためにテストコードが必要です。それには独自の権限文字列が必要です(そしてそこからは、Uri)。

新しいアプリ開発のための典型的なアプローチがapplicationIdから権限文字列を生成することです:

<provider 
    android:name="MyContentProvider" 
    android:authorities="${applicationId}.provider" 
    android:exported="false" 
    android:grantUriPermissions="true" /> 

Uri建設のためのJavaであなたの権威の文字列は、BuildConfig.APPLICATION_ID+".provider"になります。これには、(たとえばAndroid Studio経由で)ビルドにGradleを使用しているか、使用しているビルドシステムに同等の機能が必要です。

テストコードはa separate testApplicationId automaticallyになります。必要に応じて、テストコードをGradleで上書きすることもできます。プロダクションとテストのための別個のアプリケーションIDを持つことは、別個の内部ストレージがあり、コードが常に(アプリケーションID固有の権限を介して)正しいプロバイダを参照するということは、テストコードがテストプロバイダとテストを使用することを意味しますビルドの内部ストレージであり、プロダクションコードはプロダクションプロバイダとプロダクションビルドの内部ストレージを使用します。

関連する問題