سؤال

واني اسعى الى اختبار لي DB باستخدام ProviderTestCase2<T>. أستطيع أن أرى DB اختبار يتم إنشاؤه. على هذا النحو على ما أظن، يجب استخدام مزود محتوى اختبار DB الاختبار. ولكن بمجرد أن يحاول أي دعوات ضد MockContentResolver (أو واحدة تم إنشاؤها باستخدام newResolverWithContentProviderFromSql)، أحصل على UnsupportedOperationException. تم توثيق هذا لMockContentResolver هو سلوك عادي. على هذا النحو وأنا غير متأكد قليلا على الغرض من ProviderTestCase2.

وكيف يمكنك اختبار موفري المحتوى الخاص بك؟

والشكر

هل كانت مفيدة؟

المحلول

وتوسيع ProviderTestCase2 لتجاوز getMockContentResolver () والعودة صفك الخاصة المستمدة من MockContentResolver.

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

وسوف تحتاج MyMockContentResolver لتجاوز أي الأساليب التي تريد اختبار في ContentProvider الخاص بك.

وبعد ذلك يجب أن تكون قادرة على تشغيل أي اختبارات تريد على مزود المحتوى الخاص بك في حين انها معزولة من قبل ProviderTestCase2

نصائح أخرى

وبقدر ما وجدت، وإقامة محلل المحتوى وهمية ليس من الضروري صراحة - أنا قد تشرف الحالات التي (ربما الصحيح لحل مقدم عبر URI، hings التي تحتاج getType corect () يعمل)، ولكن بالنسبة لي ، كان يكفي أن تفعل شيئا من هذا القبيل:

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