Pergunta

Eu estou tentando testar meu DB usando ProviderTestCase2<T>. Eu posso ver o DB teste que está sendo criado. Como tal, eu suponho, o provedor de conteúdo testado deve usar o DB teste. Mas assim que eu tento quaisquer chamadas contra o MockContentResolver (ou o que foi criado com newResolverWithContentProviderFromSql), recebo uma UnsupportedOperationException. Isso está documentado para o MockContentResolver como um comportamento normal. Como tal, eu sou um sem saber pouco sobre o propósito da ProviderTestCase2.

Como você testar seus provedores de conteúdo?

Graças

Foi útil?

Solução

Estender ProviderTestCase2 para substituir getMockContentResolver () e retornar a sua própria classe derivada de MockContentResolver.

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

MyMockContentResolver terá que substituir todos os métodos que pretende testar na sua ContentProvider.

Em seguida, você deve ser capaz de executar todos os testes que você quer em seu provedor de conteúdo enquanto ele está isolado por ProviderTestCase2

Outras dicas

Tanto quanto eu encontrei, configurar o resolvedor conteúdo simulada não é explicitamente necessário - eu poderia supervisionar casos em que é (talvez correta de resolução do provedor via URI, hings que precisam getType corect () de trabalho), mas para mim , foi o suficiente para 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 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);
        }
    }
}

acrescento esta entrada como eu acho que pode ajudar os programadores que querem testar a sua provedor de conteúdo.

Imagine o seu provedor de conteúdo é chamado MyProvider e que você tem uma classe contrato chamado MyProviderContract definindo algumas constantes.

Em primeiro lugar, você vai escrever uma classe de teste chamado MyProviderTestCase que herda de ProviderTestCase2<MyProvider>. Você vai ter que definir um construtor que irá chamar o construtor super:

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

Então, em vez de usar diretamente o seu provedor (evite usar getProvider() como usuários de seu provedor de conteúdo não vai acessá-lo diretamente), use o getMockContentResolver() para obter uma referência a um resolvedor de conteúdo e, em seguida, chamar os métodos desta resolvedor conteúdo ( query, insert, etc). No código a seguir, mostro como testar o 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);
}

Em seguida, você pode adicionar tantos métodos de ensaio como você quer, usando um resolvedor de conteúdo em vez de seu provedor de conteúdo diretamente, como fariam os usuários do seu provedor de conteúdo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top