Android에서 컨텐츠 제공 업체를 테스트하는 방법
-
06-07-2019 - |
문제
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);
}
그런 다음 콘텐츠 제공 업체 사용자와 마찬가지로 콘텐츠 제공 업체 대신 컨텐츠 리졸버를 사용하여 원하는만큼 많은 테스트 방법을 추가 할 수 있습니다.