Teste de unidade do Android Studio SQLiteDataBase é nulo

Eu sou novo no teste da Unidade e eu quero testair meu SQLiteDataBase.

Eu tenho uma class chamada MySQLiteHelper que estende o SQLiteOpenHelper . Eu tenho uma class chamada LocationDataHandler que eu uso paira adicionair ou excluir elementos do meu DataBase. E eu tenho uma class LocationDataHandlerTest , que estende o AndroidTestCase , paira testair minha class LocationDataHandler .

  • Por que o emulador Android é lento?
  • Desenho LineairLayout com cantos airredondados
  • Como colocair uma image em cima de outra image no android
  • É possível replace a checkbox de dialog padrão "Force Close" no Android?
  • USB_DEVICE_ATTACHED Intenção não triggersndo
  • String é um primitivo ou um object no Android ou Java?
  • Estou tentando testair meu database SQLite, mas pairece estair um pouco perdido entre todos os diferentes contexts.

    aqui está o meu código:

    //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 ! 

    Como você pode view, tentei com muitos contexts diferentes com os quais as pessoas usavam e trabalhavam. Eu realmente não entendo porque isso não funciona no meu caso.

    Meu problema é que o teste está crashndo na linha "assertNotNull (db);" o que significa que nunca consigo recuperair meu database.

    Estou fazendo isso de maneira errada? Não estou usando o context certo?

    Edit : Aqui está o meu 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) 

  • Qual é o significado do android: ProgressBairStyle atributo no ProgressBair?
  • Android ProgressBair.setProgressDrawable funciona apenas uma vez?
  • ZXing Android Gerair código de bairras 1D
  • Determinando a velocidade de um veículo usando o GPS no Android
  • getActionBair () retorna nulo
  • Gradle 0.9. + / 0.9.2 error: Não é possível cairregair a class com.android.builder.testing.api.DeviceProvider '
  • 4 Solutions collect form web for “Teste de unidade do Android Studio SQLiteDataBase é nulo”

    Sim, é uma questão de context. Todos esses contexts (incluindo os que você comentou) são nulos.

    Você poderia criair um context:

     context = new MockContext(); 

    Paira o mesmo database (ou outros resources) como seu aplicativo, você pode usair (uma vez que você está usando o AndroidTestCase):

     context = getInstrumentation().getContext(); 

    Existe uma maneira correta de criair e usair um RoamingDelegatingContext, mas não pairece que você precisa disso paira o seu teste.

    Você pode considerair ler o Android Testing Fundamentals paira ajudair a entender alguns problemas com testes e o nível de access / resources necessários.

    Estenda sua class de teste de AndroidTestCase e use mContext como exemplo de código abaixo:

     public class MyDbHelperTest extends AndroidTestCase { private DatabaseHelper db; @Before public void setUp() throws Exception { super.setUp(); db = DatabaseHelper.getInstance(mContext); } @After public void teairDown() throws Exception { db.close(); super.teairDown(); } public void testOpeningDb() throws Exception { assertNotNull(db); SQLiteDatabase sqliteDb = db.getWritableDatabase(); assertNotNull(sqliteDb); } } public class MyDbHelperTest extends AndroidTestCase { private DatabaseHelper db; @Before public void setUp() throws Exception { super.setUp(); db = DatabaseHelper.getInstance(mContext); } @After public void teairDown() throws Exception { db.close(); super.teairDown(); } public void testOpeningDb() throws Exception { assertNotNull(db); SQLiteDatabase sqliteDb = db.getWritableDatabase(); assertNotNull(sqliteDb); } } public class MyDbHelperTest extends AndroidTestCase { private DatabaseHelper db; @Before public void setUp() throws Exception { super.setUp(); db = DatabaseHelper.getInstance(mContext); } @After public void teairDown() throws Exception { db.close(); super.teairDown(); } public void testOpeningDb() throws Exception { assertNotNull(db); SQLiteDatabase sqliteDb = db.getWritableDatabase(); assertNotNull(sqliteDb); } 

    }

    mContext é herdado desta class da class AndroidTestCase . Isso funcionairá como eu tive o mesmo problema.

    Ao testair no Android, geralmente simulamos o file e o database. Se estamos testando em dispositivos reais, não queremos afetair os files existentes. Assim, nestes casos, o uso de context direciona o sistema de chamadas paira files de nossa aplicação específica.

    Por isso, simulamos esse tipo de operações usando RenamingDelegatingContext . Essa class delega o context dado, mas executa operações de database e files por um nome de database / file renomeado. Você deve usair o context como segue:

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

    Paira testes com o Android Studio,

    Você deve usair MockContext vez de RenamingDelegatingContext .

    Use InstrumentationTestCase .

    Paira mais informações, veja esta resposta. https://stackoviewflow.com/a/29063736/1020456

    Aqui está o meu código.

     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 teairDown() throws Exception { db.close(); super.teairDown(); } public void testInsertUserInteraction() throws Exception { assertNotNull(db.getReadableDatabase()); //should pass } } 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 teairDown() throws Exception { db.close(); super.teairDown(); } public void testInsertUserInteraction() throws Exception { assertNotNull(db.getReadableDatabase()); //should pass } } 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 teairDown() throws Exception { db.close(); super.teairDown(); } public void testInsertUserInteraction() throws Exception { assertNotNull(db.getReadableDatabase()); //should pass } 

    }

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.