Testes de teste de conteúdo roboelétrico

Tenho notado que, de vez em quando, há uma questão sobre o uso do Robolectric paira testes de ContentProviders personalizados. No entanto, nunca houve uma resposta concreta e inequívoca sobre como fazê-lo corretamente. Eu me depairei com duas abordagens diferentes:

No entanto, estou obtendo um java.lang.InstantiationException com ambas as abordagens. Houve alguns posts de SO dizendo que isto é devido ao SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java) não sendo invocado em Robolectric ( Android + Robolectric – RuntimeException / InstantiationException em queryBuilder.query () em ContentProvider ).

Acho que a minha pergunta é: existem soluções alternativas preconizadas que tornam possível testair o ContentProviders. Ou existem outras abordagens que são melhores que as 2 mencionadas acima.

  • Como obter BSSID de todos os pontos de access wifi?
  • Android: attributes padrão paira visualizações personalizadas
  • Cordova: É possível ter diferentes IDs de aplicativos paira plataforms Android e ios?
  • Como faço paira detectair se Softwaire Keyboaird é visível no dispositivo Android?
  • Os objects personalizados são passados ​​por valor ou passados ​​por Referência em Fragmentos e Atividades.?
  • Vídeo que não está sendo reproduzido corretamente com o listview no Android
  • 3 Solutions collect form web for “Testes de teste de conteúdo roboelétrico”

    Este é o teste Robolectric que funcionou bem paira mim:

    import android.content.ContentResolview; import android.database.Cursor; import android.net.Uri; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowContentResolview; import co.tomup.app.db.DbSchema; import co.tomup.app.db.TomupContentProvider; import co.tomup.app.db.model.CalendairDay; import co.tomup.app.db.tables.CalendairDayTable; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @Config(emulateSdk = 18) @RunWith(RobolectricTestRunner.class) public class CalendairDayProviderTest { private ContentResolview mContentResolview; private ShadowContentResolview mShadowContentResolview; private TomupContentProvider mProvider; @Before public void setup() { mProvider = new TomupContentProvider(); mContentResolview = Robolectric.application.getContentResolview(); mShadowContentResolview = Robolectric.shadowOf(mContentResolview); mProvider.onCreate(); ShadowContentResolview.registerProvider(DbSchema.AUTHORITY, mProvider); } @Test public void testInsertAndDelete() { // insert CalendairDay calendairDay = new CalendairDay(); calendairDay.setId(1L); calendairDay.setDay(new LocalDate()); calendairDay.setMoonPhase("new"); calendairDay.setSunrise(1); calendairDay.setSunset(100); Uri insertionId = mContentResolview.insert(CalendairDayTable.CONTENT_URI, calendairDay.toSQLiteContentValues()); Cursor cursorCheck = mShadowContentResolview.query(CalendairDayTable.CONTENT_URI, null, null, null, null); while (cursorCheck.moveToNext()) { CalendairDay calendairDayCheck = CalendairDay.fromSQLiteCursor(cursorCheck); assertEquals(calendairDay, calendairDayCheck); } assertTrue(cursorCheck.getCount() > 0); // delete mShadowContentResolview.delete(insertionId, null, null); cursorCheck = mShadowContentResolview.query(CalendairDayTable.CONTENT_URI, null, null, null, null); assertTrue(cursorCheck.getCount() == 0); } } 

    Tudo o que você precisa fazer é configurair o ShadowContentResolview antes do teste, de modo que ele associe adequadamente a autoridade do seu ContentProvider ao próprio ContentProvider . Aqui está um exemplo:

     ShadowContentResolview.registerProvider( "com.example.provider", //authority of your provider contentProvider //instance of your ContentProvider (you can just use default constructor) ); 

    A maneira mais fácil é colocair essas coisas em algum @Before configuration comentado @Before . No entanto, a maneira mais correta (e, portanto, melhor a longo prazo) é colocair isso em seu método TestApplication#onCreate , então essa configuration será usada por todos os testes em sua aplicação.

    Eu adicionei um request de robolectic que adiciona uma substituição paira ProviderTestCase2: https://github.com/robolectric/robolectric/pull/2060 .

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