2015-05-28 9 views
8

Sono nuovo al test di unità e voglio testare il mio SQLiteDataBase.Test di Android Studio Unit SQLiteDataBase è nullo

ho una classe di nome MySQLiteHelper che si estende SQLiteOpenHelper. Ho una classe denominata LocationDataHandler che uso per aggiungere o eliminare elementi dal mio DataBase. E ho una classe LocationDataHandlerTest, che si estende AndroidTestCase, per testare la mia LocationDataHandler classe.

Sto provando a testare il mio database SQLite ma mi sembra di essere un po 'perso tra tutti i diversi contesti.

Ecco il mio codice:

//Context context = new Activity(); 

//IsolatedContext context = getMockContext(); 

//Context context = new MockContext(); 

//Context context = getInstrumentation().getContext(); 

    Context context = getContext(); 

    helper = new MySQLiteHelper(context); 
    assertNotNull(helper); 

    SQLiteDatabase db = helper.getWritableDatabase(); 
    assertNotNull(db); <---- it fails here ! 

come potete vedere ho provato con molti contesti differenti che ho visto persone utilizzano e lavorano con. Non capisco davvero perché non funzioni nel mio caso.

Il mio problema è che il test sta fallendo sulla linea "assertNotNull (db);" il che significa che non posso mai recuperare il mio database.

Sto facendo questo nel modo sbagliato? Non sto usando il contesto giusto?

Edit: Ecco la mia logcat:

junit.framework.AssertionFailedError 
    at junit.framework.Assert.fail(Assert.java:55) 
    at junit.framework.Assert.assertTrue(Assert.java:22) 
    at junit.framework.Assert.assertNotNull(Assert.java:256) 
    at junit.framework.Assert.assertNotNull(Assert.java:248) 
    at junit.framework.TestCase.assertNotNull(TestCase.java:417) 
    at com.databerries.LocationDataHandlerTest.testAddLocation(LocationDataHandlerTest.java:72) 
+0

puoi aggiungere il logcat? solo per ottenere in dettaglio qual è il tuo problema .. –

+0

Hai provato 'getInstrumentation.getTargetContext()'? –

+0

sì, mi lancia un'eccezione di puntatore nullo sulla riga: 'Contesto contesto = getInstrumentation(). GetTargetContext();' –

risposta

1

Sì, si tratta di un problema di contesto. Tutti questi contesti (compresi quelli che hai commentato) sono nulli.

Si potrebbe creare un contesto:

context = new MockContext(); 

Per lo stesso database (o altre risorse) come applicazione, è possibile utilizzare (dal momento che si sta utilizzando AndroidTestCase):

context = getInstrumentation().getContext(); 

C'è un modo corretto per creare e utilizzare un RoamingDelegatingContext, ma non sembra che sia necessario per il test.

È possibile considerare di leggere Android Testing Fundamentals per aiutare a comprendere alcuni problemi con i test e il livello di accesso/risorse necessari.

+1

ciao! grazie per la risposta, ma nessuna di queste soluzioni ha funzionato ... il contesto = new MockContext(); mi dà lo stesso errore che è che il mio database è nullo. E il contesto = getInstrumentation(). GetContext(); mi dà questo errore: java.lang.NullPointerException a com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest.java:66) (. linea 66 è la linea con il contesto = getInstrumentation() getContext();) –

+0

@ ThéoRichard Provare a cambiare il tuo tipo di test su ActivityTestCase o InstrumentationTestCase. Mi sono appena reso conto di aver letto male la documentazione e ho pensato che AndroidTestCase fosse una sottoclasse di InstrumentationTestCase (in realtà ActivityTestCase è la sottoclasse). Quindi è possibile riprovare la chiamata getInstrumentation(). GetContext(). – iheanyi

+1

ancora lo stesso errore, java.lang.NullPointerException su com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest.java: 66) (la riga 66 è la riga con context = getInstrumentation(). GetContext();) –

0

Durante i test su Android, generalmente prendiamo in giro file e il database. Se stiamo testando su dispositivi reali, non vogliamo influenzare i file esistenti. Pertanto in questi casi l'utilizzo del contesto indirizza le chiamate al file system della nostra specifica applicazione.

Quindi prendiamo in giro questo tipo di operazioni utilizzando RenamingDelegatingContext. Questa classe delega al contesto specificato, ma esegue operazioni su database e file da un nome di database/file rinominato. Si dovrebbe usare contesto come segue:

RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_db"); 
helper = new MySQLiteHelper(context); 
assertNotNull(helper); 
SQLiteDatabase db = helper.getWritableDatabase(); 
assertNotNull(db); 
+0

l'asserNotNull (db); la dichiarazione continua a fallire ... –

+0

@ ThéoRichard hai controllato la tua classe di supporto se i codici per la creazione del database sono corretti? –

0

Per il test con Android Studio,

Si consiglia di utilizzare MockContext invece di RenamingDelegatingContext.

Utilizzare InstrumentationTestCase.

Per ulteriori informazioni, vedere questa risposta. https://stackoverflow.com/a/29063736/1020456

Ecco il mio codice.

public class DatabaseHelperTest extends InstrumentationTestCase{ 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 

    MockContext context = new MockContext(); 
    db = DatabaseHelper.getInstance(context); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testInsertUserInteraction() throws Exception { 
    assertNotNull(db.getReadableDatabase()); //should pass 
} 

}

1

estendere la vostra classe di test da AndroidTestCase e utilizzare mContext come qui di seguito di codice:

public class MyDbHelperTest extends AndroidTestCase { 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 
    db = DatabaseHelper.getInstance(mContext); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testOpeningDb() throws Exception { 
    assertNotNull(db); 
    SQLiteDatabase sqliteDb = db.getWritableDatabase(); 
    assertNotNull(sqliteDb); 
    } 

}

mContext è ereditata a questa classe da AndroidTestCase classe. Funzionerà come ho avuto lo stesso problema.