2009-08-01 21 views
10

Estoy intentando probar mi base de datos usando ProviderTestCase2<T>. Puedo ver el DB de prueba que se está creando. Como tal, supongo, el proveedor de contenido probado debería usar el DB de prueba. Pero tan pronto como intento cualquier llamada en contra de MockContentResolver (o la creada con newResolverWithContentProviderFromSql), obtengo un UnsupportedOperationException. Esto está documentado para MockContentResolver como comportamiento normal. Como tal, estoy un poco inseguro sobre el propósito de ProviderTestCase2.Cómo probar proveedores de contenido en Android

¿Cómo evalúa a sus proveedores de contenido?

Gracias

Respuesta

3

Extender ProviderTestCase2 para anular getMockContentResolver() y devolver su propia clase derivada de MockContentResolver.

public class MyProviderTestCase2 extends ProviderTestCase2 { 
    @Override 
    public MockContentResolver getMockContentResolver() { 
     return new MyMockContentResolver(); 
    } 
} 

MyMockContentResolver tendrá que sustituir algún método que desea probar en su ContentProvider.

Entonces usted debe ser capaz de ejecutar cualquier prueba que desee en su proveedor de contenidos mientras está aislado por ProviderTestCase2

13

Por lo que he encontrado, la creación de los contenidos de resolución de simulacro no es explícitamente necesaria - que podría supervisar los casos en que es (tal vez correcta resolución del proveedor a través de URI, hings que necesitan getType corect() de trabajo), pero para mí, fue suficiente para hacer algo como esto:

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 parameters, 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.parse("definitelywrong"), null, null, null, null); 
      // we're wrong if we get until here! 
      fail(); 
     } catch (IllegalArgumentException e) { 
      assertTrue(true); 
     } 
    } 
} 
+0

No hay mucho código de muestra en la clase ProviderTestCase2 en Internet. Esto es muy útil. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

En [Documentación de Android] (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest), recomiendan no usar directamente su proveedor de contenido y pasar a través de un solucionador de contenido en su lugar. Acabo de leer mi publicación para ver un ejemplo más adecuado de cómo probar un proveedor de contenido. – eternay

6

añado esta entrada ya que creo que puede ayudar a los programadores que quieran probar su proveedor de contenido.

Imagine que su proveedor de contenido se llama MyProvider y que tiene una clase de contrato llamada MyProviderContract que define algunas constantes.

Antes que nada, escribirás una clase de prueba llamada MyProviderTestCase que hereda de ProviderTestCase2<MyProvider>. Vas a tener que definir un constructor que se llame a la super constructor:

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

Entonces, en lugar de utilizar directamente su proveedor (evitar el uso de getProvider() como usuarios de su proveedor de contenidos no tendrán acceso a él directamente), utilice el getMockContentResolver() para obtener una referencia a un solucionador de contenido y luego llamar a los métodos de este solucionador de contenido (query, insert, etc.). En el siguiente código, muestro cómo probar el método 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 = getMockContentResolver().insert(uri, values); 
    // Then you can test the correct execution of your insert: 
    assertNotNull(resultingUri); 
    long id = ContentUris.parseId(resultingUri); 
    assertTrue(id > 0); 
} 

A continuación, puede añadir tantos métodos de prueba que desee, utilizando un dispositivo de resolución contenido en lugar de su proveedor de contenido directamente, como lo haría usuarios de su proveedor de contenido.

+1

¿Cómo ejecutas ProviderTestCase? ¿Variante de compilación de prueba de la unidad Android o prueba de instrumentación? – MRodrigues

Cuestiones relacionadas