2017-01-14 2 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" /> 

вашей строки полномочий, в Java для Uri строительства, становится BuildConfig.APPLICATION_ID+".provider". Это требует, чтобы вы использовали Gradle для своих сборок (например, через Android Studio) или имели эквивалентную установку в любой системе сборки, которую используете.

Ваш тестовый код получит a separate testApplicationId automatically, или вы можете переопределить его в Gradle, если хотите. Наличие отдельного идентификатора приложения для производства и тестирования означает, что у вас есть отдельное внутреннее хранилище, и когда ваш код всегда ссылается на правильного поставщика (через полномочия, связанные с идентификатором приложения), означает, что ваш тестовый код будет использовать поставщика теста и тест встроенное хранилище, а ваш производственный код будет использовать поставщик продукции и внутреннее хранилище производственной сборки.

Смежные вопросы