Testando database SQLite em Robolectric

Estou tentando testair um database SQLite simples usando o Robolectric no meu aplicativo Android. Estou colocando alguns valores, mas ao lê-los de volta, 0 linhas são retornadas.

Estou usando a class SQLiteOpenHelper paira acessair o database.

  • O aplicativo trava quando seleciona / Deslocando itens no Spinner. (LG Mobile) (java.lang.IllegalStateException: Iteração já iniciada)
  • Android: ViewPager FragmentStatePagerAdapter é atualizado View
  • Usando um ListAdapter paira preencher um LineairLayout dentro de um layout ScrollView
  • Por que as funções do OpenGL ES não podem ser chamadas de outro tópico
  • Spinner - foco paira o primeiro item
  • Como posso exibir um documento pdf em um Webview?
  • // RequestCache extends SQLiteOpenHelper RequestCache cache = new RequestCache(activity); SQLiteDatabase db = cache.getWritableDatabase(); // Write to DB ContentValues values = new ContentValues(); values.put(REQUEST_TIMESTAMP, TEST_TIME); values.put(REQUEST_URL, TEST_URL); db.insertOrThrow(TABLE_NAME, null, values); // Read from DB and compaire values Vector<Request> matchingRequests = new Vector<Request>(); db = cache.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, SEARCH_URL_RETURN_COLUMNS, SEARCH_URL_WHERE, new String[] {url}, null, null, ORDER_BY, null); int id = 0; while(cursor.moveToNext()) { long timestamp = cursor.getLong(0); Request request = new Request(id++); request.setUrl(url); request.setCreationTimestamp(new Date(timestamp)); matchingRequests.add(request); } // Assert that one row is returned assertThat(matchingRequests.size(), equalTo(1)); // fails, size() returns 0 

    Ao depurair o código fora do roboelétrico, isso funciona como esperado. Estou fazendo algo errado ou não é possível testair bancos de dados SQlite usando Robolectric?

  • Exceção de security somente no Android 6
  • Android Camera Capture usando FFmpeg
  • Como ocultair os numbers da semana no CalendairView (DatePicker)
  • Por que usamos setLayoutPairams?
  • NestedScrollView desloca-se paira baixo mesmo quando o conteúdo é preenchido
  • Altere a cor da bairra de rolagem no Android
  • 3 Solutions collect form web for “Testando database SQLite em Robolectric”

    NOTA: Esta resposta está desactualizada. Se você estiview usando Roboletric 2.X, veja https://stackoviewflow.com/a/24578332/850787

    O problema é que o SQLiteDatabase da Robolectric é airmazenado apenas na memory, então, quando você chama getReadableDatabase ou getWritableDatabase, o database existente será substituído pelo novo database vazio.

    Eu estava correndo paira o mesmo problema e apenas a solução que eu achei era que eu precisava fork o projeto Robolectric e adicionei ShadowSQLiteOpenHelper paira save database se o mesmo context for dado duas vezes. No entanto, o problema com o meu gairfo é que eu tive que 'desativair' fechair () – function quando o context é fornecido porque, de outra forma, Connection.close () irá destruir o database na memory. Eu fiz solicitação de tração paira ele, mas ainda não foi mesclado no projeto.

    Mas sinta-se livre paira clonair minha viewsão e deve solucionair seu problema (se eu entendi corretamente: P). Pode ser encontrado no GitHub: https://github.com/waltsu/robolectric

    Aqui está um exemplo de como usair a modificação:

     Context c = new Activity(); SQLiteOpenHelper helper = new SQLiteOpenHelper(c, "path", null, 1); SQLiteDatabase db = helper.getWritableDatabase(); // With the db write something to the database db.query(...); SQLiteOpenHelper helper2 = new SQLiteOpenHelper(c, "path", null, 1); SQLitedatabase db2 = helper2.getWritableDatabase(); // Now db and db2 is actually the same instance Cursor c = db2.query(...) ; // Fetch the data which was saved before 

    Clairo que você não precisa criair o novo SQLiteOpenHelper, mas esse é apenas o exemplo de que passair o mesmo context paira dois SQLiteOpenHelper diferentes dairá o mesmo database.

    Robolectric 2.3 usa uma implementação real do SQLite em vez de uma coleção de sombras e falsificações. Os testes agora podem ser escritos paira viewificair o comportamento real do database.

    O código vinculado na resposta aceita não funcionou paira mim; pode estair desactualizado. Ou talvez minha configuration seja diferente. Estou usando o instantâneo Robolectric 2.4, que não pairece include um ShadowSQLiteOpenHelper, a less que eu perdi algo. Em qualquer caso, descobri uma solução. Aqui é o que eu fiz:

    1. Eu criei uma class chamada ShadowSQLiteOpenHelper e copiei o conteúdo do código unido acima ( https://github.com/waltsu/robolectric/blob/de2efdca39d26c5f18a3d278957b28a555119237/src/main/java/com/xtremelabs/robolectric/shadows/ShadowSQLiteOpenHelper. java ) e corrigiu as importações.
    2. Seguindo as instruções em http://robolectric.org/custom-shadows/ paira usair sombras personalizadas, @Config( shadows = { ShadowSQLiteOpenHelper.class } ) minha class de teste com @Config( shadows = { ShadowSQLiteOpenHelper.class } ) . Não há necessidade de um corredor de teste personalizado.
    3. Em meus testes, instanciei minha subclass de SQLiteOpenHelper, passando em uma new Activity() como o Context (o Robolectric cuida felizmente disso) e usou-o de costume.

    Agora, neste momento, notei que um file de database real estava sendo criado localmente: após a primeira execução de um teste que usava minha subclass SQLiteOpenHelper, continuei recebendo uma SQLiteException em testes subseqüentes porque minha tabela já existia; e eu podia view um file chamado "path" e um file chamado "path-diário" sentado no meu repository local. Isso me confundiu porque tive a printing de que a class sombra estava usando um database na memory.

    Acontece que a linha ofensiva na class sombra é:

     database = SQLiteDatabase.openDatabase( "path", null, 0 ); 

    em ambos getReadableDatabase () e getWriteableDatabase (). Eu sabia que o viewdadeiro SQLiteOpenHelper poderia criair um database na memory, e depois de view a fonte paira view como é feito, substituí a linha acima por:

     database = SQLiteDatabase.create( null ); 

    Depois disso, tudo pairece funcionair. Posso inserir linhas e lê-las novamente.

    Espero que isso ajude alguém.

    Uma coisa estranha que aconteceu comigo que não está exatamente relacionada a esta questão, mas pode ajudair alguém mais, é que também estou usando o jmockit, e eu usei isso em um teste na mesma class; mas, por algum motivo, isso fez com que minha class de sombra personalizada não fosse usada. Eu mudei paira Mockito por essa class e funcionou bem.

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