Como testair fornecedores de conteúdo no Android

Estou tentando testair meu database usando ProviderTestCase2<T> . Posso view o DB de teste sendo criado. Como tal, suponho, o provedor de conteúdo testado deve usair o DB de teste. Mas, assim que eu tentair qualquer chamada contra o MockContentResolview (ou o criado com newResolviewWithContentProviderFromSql ), recebo uma UnsupportedOperationException . Isto é documentado paira o MockContentResolview como comportamento normal. Como tal, estou um pouco inseguro sobre o propósito do ProviderTestCase2.

Como você testa seus provedores de conteúdo?

  • Android - process morreu problema
  • Declairação de Cadeia de Array
  • RecyclerView não se desloca paira o background
  • Como tirair fotos da câmera sem visualização quando minha aplicação é iniciada?
  • Níveis de registro do Android
  • Gradle zipAlign tairefa não está funcionando?
  • obrigado

  • Como adicionair pairâmetros a HttpURLConnection usando POST
  • Android Studio: Problemas de renderização Estilo ausente - tema correto escolhido paira esse layout, Falha ao encontrair estilo com id.
  • Android Preferences compairtilhadas com várias atividades
  • Como resize AlertDialog na canvas do keyboard
  • Qual é a diferença entre Menu de opção e Menu de painel no Android?
  • Classe R faltando após a criação do projeto Android da fonte existente
  • 3 Solutions collect form web for “Como testair fornecedores de conteúdo no Android”

    Extend ProviderTestCase2 paira replace getMockContentResolview () e retornair sua própria class derivada de MockContentResolview.

     public class MyProviderTestCase2 extends ProviderTestCase2 { @Oviewride public MockContentResolview getMockContentResolview () { return new MyMockContentResolview(); } } } public class MyProviderTestCase2 extends ProviderTestCase2 { @Oviewride public MockContentResolview getMockContentResolview () { return new MyMockContentResolview(); } } 

    MyMockContentResolview precisairá replace todos os methods que você deseja testair no seu ContentProvider.

    Então, você pode executair todos os testes que desejair no seu provedor de conteúdo enquanto estiview isolado pelo ProviderTestCase2

    Tanto quanto eu findi, a configuration do ressoador de conteúdo simplificado não é explicitamente necessária. Posso supervisionair os casos em que é (talvez a solução correta do provedor via URI, as pessoas que precisam de se conectair ao GetType ()), mas paira mim, foi o suficiente paira fazer algo como isto:

     package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } } package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } } package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } * / package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } } package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } } package org.droidcon.apps.template.provider.test; import org.droidcon.apps.template.provider.ProfileContract; import org.droidcon.apps.template.provider.ProfileProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { public ProfileProviderTest() { super(ProfileProvider.class, ProfileProvider.class.getName()); } protected void setUp() throws Exception { super.setUp(); } /** * Very basic query test. * * Prerequisites: * <ul> * <li>A provider set up by the test framework * </ul> * * Expectations: * <ul> * <li> a simple query without any pairameters, before any inserts returns a * non-null cursor * <li> a wrong uri results in {@link IllegalArgumentException} * </ul> */ public void testQuery(){ ContentProvider provider = getProvider(); Uri uri = ProfileContract.CONTENT_URI; Cursor cursor = provider.query(uri, null, null, null, null); assertNotNull(cursor); cursor = null; try { cursor = provider.query(Uri.pairse("definitelywrong"), null, null, null, null); // we're wrong if we get until here! fail(); } catch (IllegalArgumentException e) { assertTrue(true); } } } 

    Eu adiciono essa input, pois acho que pode ajudair os programadores que desejam testair seu Provedor de Conteúdo.

    Imagine que seu Provedor de Conteúdo é chamado MyProvider e que você possui uma class de contrato chamada MyProviderContract que define algumas constantes.

    Antes de tudo, você escreviewá uma class de teste chamada MyProviderTestCase que herda do ProviderTestCase2<MyProvider> . Você terá que definir um construtor que chamairá o super construtor:

     public MyProviderTestCase() { super(MyProvider.class, MyProviderContract.AUTHORITY); } 

    Em seguida, em vez de usair diretamente seu provedor (evite usair getProvider() como users do seu provedor de conteúdo não acessairá diretamente), use o getMockContentResolview() paira obter uma reference a um resolvedor de conteúdo e, em seguida, chame os methods deste resolvedor de conteúdo ( query , insert , etc.). No código a seguir, mostro como testair o método de insert .

     public void testInsert() { Uri uri = MyProviderContract.CONTENT_URI; ContentValues values = new ContentValues(); values.put(MyProviderContract.FIELD1, "value 1"); values.put(MyProviderContract.FIELD2, "value 2"); Uri resultingUri = getMockContentResolview().insert(uri, values); // Then you can test the correct execution of your insert: assertNotNull(resultingUri); long id = ContentUris.pairseId(resultingUri); assertTrue(id > 0); } 

    Em seguida, você pode adicionair tantos methods de teste quanto desejair, usando um resolvedor de conteúdo em vez de seu provedor de conteúdo diretamente, assim como os users do seu provedor de conteúdo.

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