2017-01-14 10 views
-1

Ich habe begonnen, für meine Content-Provider einen einfachen Test zu schreiben. Das Problem ist, wenn ich den Test verwende, verwendet es Produktionsdaten. Wie kann ich sicherstellen, dass separate Testdaten aus meinen Live-App-Daten verwendet werden?Content Prüfung - Trennung von Produktion und Testdaten

@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

ich nicht bekommen, was Sie archivieren wollen? .. Könnten Sie vielleicht sagen, was die Dinge tun sollten und was sie stattdessen tun? – creativecreatorormaybenot

+0

Ist 'MyContentProvider.uri' die echte Produktion' Uri'? – CommonsWare

+0

@CommonsWare, ja ist es. Ich habe es als eine Mitgliedsvariable von MyContentProvider, sollte ich einen anderen URI verwenden? – Stephen

Antwort

1

sollte ich einen anderen URI sein?

Ja. Ihr Testcode trifft Ihren Produktionsanbieter. Sie benötigen Ihren Testcode, um Ihren separaten Testanbieter zu treffen, und dieser benötigt eine eigene Autorisierungszeichenfolge (und von dort aus Uri).

Ein typischer Ansatz für neue App-Entwicklung ist die Autorität Zeichenfolge aus dem applicationId zu generieren:

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

Ihre Behörde Zeichenfolge, in Java für Uri Aufbau wird BuildConfig.APPLICATION_ID+".provider". Dies erfordert, dass Sie Gradle für Ihre Builds verwenden (z. B. über Android Studio) oder über eine entsprechende Funktion in dem von Ihnen verwendeten Build-System verfügen.

Ihr Testcode erhält a separate testApplicationId automatically, oder Sie können es in Gradle außer Kraft setzen, wenn Sie wollen. Eine separate Anwendungs-ID für Produktion vs. Test bedeutet, dass Sie über separaten internen Speicher verfügen und Ihr Code sich immer auf den richtigen Anbieter bezieht (über die Anwendungs-ID-spezifische Berechtigung) bedeutet, dass Ihr Testcode den Testanbieter und den Test verwendet Build-internen Speicher und Ihr Produktionscode verwendet den internen Speicher des Produktionsanbieters und des Produktions-Builds.