문제

DB를 사용하여 테스트하려고합니다 ProviderTestCase2<T>. 테스트 DB가 생성되는 것을 볼 수 있습니다. 따라서 테스트 된 컨텐츠 제공 업체는 테스트 DB를 사용해야합니다. 그러나 내가 전화를 시도하자마자 MockContentResolver (또는 함께 만든 것 newResolverWithContentProviderFromSql), 나는 얻었다 UnsupportedOperationException. 이것은 Mockcontentresolver에 대해 정상적인 행동으로 문서화됩니다. 따라서 나는 ProviderTestescase2의 목적에 대해 조금 확신 할 수 없습니다.

컨텐츠 제공 업체를 어떻게 테스트합니까?

감사

도움이 되었습니까?

해결책

getMockContentResolver ()를 무시하려면 ProviderTestestcase2를 확장하고 MockContentResolver에서 파생 된 자신의 클래스를 반환하십시오.

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

MyMockContentResolver는 ContentProvider에서 테스트하려는 모든 메소드를 무시해야합니다.

그런 다음 컨텐츠 제공 업체에서 원하는 테스트를 실행할 수 있어야합니다.

다른 팁

내가 찾은 한, Mock Content Resolver를 설정하는 것은 명시 적으로 필요하지 않습니다. 나는 그것이 어디에있는 경우를 감독 할 수 있습니다 (아마도 URI를 통해 제공자를 올바르게 해결할 수 있습니다. 다음과 같은 일을하기에 충분합니다.

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

이 항목을 추가하여 콘텐츠 제공 업체를 테스트하려는 프로그래머를 도울 수 있다고 생각합니다.

컨텐츠 제공 업체가 MyProvider라고하며 일부 상수를 정의하는 MyProviderContract라는 계약 클래스가 있다고 상상해보십시오.

우선, 당신은 MyProviderTestCase 그게 상속됩니다 ProviderTestCase2<MyProvider>. 호출 할 생성자를 정의해야합니다. super 건설자:

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

그런 다음 공급자를 직접 사용하는 대신 getProvider() 콘텐츠 제공 업체의 사용자가 직접 액세스하지 않으므로 사용하십시오. getMockContentResolver() 컨텐츠 리졸버에 대한 참조를 얻은 다음이 컨텐츠 리졸버의 메소드를 호출하려면 (query, insert, 등.). 다음 코드에서는 테스트 방법을 보여줍니다. 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);
}

그런 다음 콘텐츠 제공 업체 사용자와 마찬가지로 콘텐츠 제공 업체 대신 컨텐츠 리졸버를 사용하여 원하는만큼 많은 테스트 방법을 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top