Pregunta

Estoy intentando probar mi DB usando ProviderTestCase2<T>. Puedo ver la base de datos de prueba que se está creando. Como tal, supongo, el proveedor de contenido probado debe usar la base de datos de prueba. Pero tan pronto como intento realizar alguna llamada contra el MockContentResolver (o el creado con newResolverWithContentProviderFromSql), recibo un UnsupportedOperationException. Esto está documentado para MockContentResolver como comportamiento normal. Como tal, estoy un poco inseguro sobre el propósito de ProviderTestCase2.

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

Gracias

¿Fue útil?

Solución

Extienda 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 deberá anular cualquier método que desee probar en su ContentProvider.

Entonces debería poder ejecutar las pruebas que desee en su proveedor de contenido mientras está aislado por ProviderTestCase2

Otros consejos

Por lo que encontré, configurar el simulador de resolución de contenido no es explícitamente necesario: podría supervisar los casos en que lo esté (tal vez la resolución correcta del proveedor a través de URI, las cosas que necesitan que funcione corect getType ()), 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);
        }
    }
}

Agrego esta entrada porque 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.

En primer lugar, escribirás una clase de prueba llamada MyProviderTestCase que hereda de ProviderTestCase2<MyProvider>. Tendrá que definir un constructor que llamará al super constructor:

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

Luego, en lugar de usar directamente a su proveedor (evite usar getProvider() ya que los usuarios de su proveedor de contenido no accederán directamente a él), use getMockContentResolver() para obtener una referencia a un solucionador de contenido y luego llame a los métodos de este solucionador de contenido (query, insert, etc.). En el siguiente código, muestro cómo probar el método <=>.

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);
}

Luego puede agregar tantos métodos de prueba como desee, utilizando un solucionador de contenido en lugar de su proveedor de contenido directamente, como lo harían los usuarios de su proveedor de contenido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top