2009-08-01 44 views
10

Tôi đang cố gắng kiểm tra DB của mình bằng cách sử dụng ProviderTestCase2<T>. Tôi có thể thấy DB thử nghiệm đang được tạo. Như tôi cho là, nhà cung cấp nội dung được kiểm tra nên sử dụng DB thử nghiệm. Nhưng ngay sau khi tôi thử bất kỳ cuộc gọi nào chống lại số MockContentResolver (hoặc số được tạo với newResolverWithContentProviderFromSql), tôi nhận được UnsupportedOperationException. Đây là tài liệu cho MockContentResolver như là hành vi bình thường. Như vậy tôi có một chút không chắc chắn về mục đích của ProviderTestCase2.Cách kiểm tra nhà cung cấp nội dung trên Android

Làm cách nào để bạn kiểm tra các nhà cung cấp nội dung của mình?

Cảm ơn

Trả lời

3

Mở rộng ProviderTestCase2 để ghi đè getMockContentResolver() và trở về lớp học riêng của bạn bắt nguồn từ MockContentResolver.

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

MyMockContentResolver sẽ cần ghi đè bất kỳ phương pháp nào bạn muốn thử nghiệm trong Trình cung cấp nội dung.

Sau đó, bạn sẽ có thể chạy bất kỳ bài kiểm tra bạn muốn vào nhà cung cấp nội dung của bạn trong khi nó đang bị cô lập bởi ProviderTestCase2

13

Theo như tôi thấy, việc thiết lập resolver nội dung giả là không rõ ràng cần thiết - Tôi có thể giám sát các trường hợp nó là (có lẽ đúng giải quyết của nhà cung cấp thông qua URI, hings cần getType corect() ngày làm việc), nhưng đối với tôi, nó là đủ để làm một cái gì đó như thế này:

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

Không có nhiều mã mẫu trên lớp ProviderTestCase2 trên internet. Điều này rất hữu ích. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

Trong [Tài liệu Android] (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest), họ khuyên bạn không nên sử dụng trực tiếp nhà cung cấp nội dung của bạn và chuyển qua trình giải quyết nội dung thay thế. Chỉ cần đọc bài đăng của tôi để xem ví dụ đầy đủ hơn về cách kiểm tra nhà cung cấp nội dung. – eternay

6

tôi thêm cụm từ này như tôi nghĩ rằng nó có thể giúp các lập trình viên muốn kiểm tra Nhà cung cấp nội dung của họ.

Hãy tưởng tượng Nhà cung cấp nội dung của bạn được gọi là MyProvider và bạn có một lớp hợp đồng được gọi là MyProviderContract xác định một số hằng số.

Trước hết, bạn sẽ viết một lớp thử nghiệm có tên là MyProviderTestCase được kế thừa từ ProviderTestCase2<MyProvider>. Bạn sẽ phải xác định một constructor mà sẽ gọi super constructor:

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

Sau đó, thay vì sử dụng trực tiếp cung cấp dịch vụ của bạn (tránh sử dụng getProvider() là người sử dụng của nhà cung cấp nội dung của bạn sẽ không thể truy cập trực tiếp), sử dụng getMockContentResolver() để lấy tham chiếu đến trình phân giải nội dung và sau đó gọi phương thức của trình giải quyết nội dung này (query, insert, v.v.). Trong đoạn mã sau, tôi chỉ cách kiểm tra phương thức 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); 
} 

Sau đó, bạn có thể thêm bao nhiêu phương pháp thử thay vì nhà cung cấp nội dung trực tiếp, cũng như người dùng của nhà cung cấp nội dung của bạn.

+1

Làm thế nào để bạn chạy ProviderTestCase? Biến thể xây dựng thử nghiệm đơn vị Android hoặc Kiểm tra thiết bị đo đạc? – MRodrigues

Các vấn đề liên quan