2010-07-26 18 views
17

Tôi đã viết một lớp học đang sử dụng Context, thư viện của bên thứ ba và SharedPreferences từ PreferenceManager.Làm thế nào để thử PreferenceManager trong Android?

Có thể giả lập Context, thư viện của bên thứ ba có thể được chế nhạo bằng cách sử dụng một số khung mocking, nhưng phải làm gì với PreferenceManager?

Tôi có hai phương pháp:

public void saveString(ThirdPartyObject obj) { 
    SharedPreferences appPreferences = 
     PreferenceManager.getDefaultSharedPreferences(mContext); 
    SharedPreferences.Editor editor = appPreferences.edit(); 
    editor.putString(mContext.getString(
     R.string.preferences_string_name), obj.getString()); 
    editor.commit(); 
} 

và tương ứng, mà tải sở thích.

+10

Có bất kỳ hành vi cụ thể nào trong 'Trình xử lý ưu tiên' mà bạn cần giả lập không? Nếu không mã kiểm tra tùy chọn hoạt động tốt từ 'AndroidTestCase'. –

+1

Thật đáng tiếc là tôi không thể chấp nhận nhận xét - nhưng những gì bạn đã viết đã thỏa mãn tôi. – pixel

Trả lời

5

Có vẻ như bạn thực sự không muốn mẫu giả PreferenceManager (chủ yếu được sử dụng trong một số PreferenceFragment hoặc PreferenceActivity).

Bạn có thể muốn một trong hai:

  1. Một giả SharedPreferences, trong trường hợp này bạn có thể chỉ nhạo báng Context#getSharedPreferences (được gọi bằng PreferenceManager#getDefaultSharedPreferences dù sao đi nữa). Có thể bạn cũng phải tạo ra một mô hình SharedPreferences.Editor nếu tùy chọn được chỉnh sửa, như trên. Bạn nói rằng bạn đã biết làm thế nào để giả lập bối cảnh, do đó, điều này nên được khá đơn giản.

  2. Để sử dụng các tùy chọn thực tế trong môi trường. Điều này là dễ nhất, và không nhất thiết phải là một ý tưởng tồi. Làm cho chắc chắn nó được làm sạch đúng cách để kiểm tra của bạn không can thiệp với nhau (hoặc, tùy thuộc vào môi trường thử nghiệm của bạn, không bị ảnh hưởng bởi việc sử dụng thủ công của ứng dụng).

Nếu bạn thực sự làm muốn thử PreferenceManager dụ (như rằng bạn nhận được trong PreferenceFragment hoặc PreferenceActivity), bạn hoàn toàn có thể làm như vậy.

Vì không phải là cuối cùng, bạn có thể tạo mô hình PreferenceManagerSharedPreferences sử dụng Mockito (hoặc một thư viện nhạo báng khác) miễn là bạn có cách để cung cấp mã cho bất kỳ nơi đâu. mã, điều này thường xuất phát từ số getPreferenceManager()).

+1

'Ngữ cảnh # getSharedPreferences' yêu cầu bạn chuyển tên tệp. –

2

Bạn có thể sử dụng ngữ cảnh chuyên dụng cho tùy chọn được chia sẻ. RenamingDelegatingContext ủy quyền mọi thứ cho một Ngữ cảnh. Khi chúng tôi truy cập SharedPreference từ một số Context, chúng tôi sử dụng getSharedPreferences(String name, int mode).

Ở đây bằng cách mở rộng RenamingDelegatingContext, chúng tôi ghi đè getSharedPreferences và giả vờ tham số tên bằng thử nghiệm PREFIX, Vì vậy, khi chạy thử nó sẽ ghi vào tệp tùy chọn khác với ứng dụng chính.

public class SpecializedMockContext extends RenamingDelegatingContext { 
    public static final String PREFIX = "test."; 

    public SpecializedMockContext(Context context) { 
     super(context, PREFIX); 
    } 

    @Override 
    public SharedPreferences getSharedPreferences(String name, int mode) { 
     return super.getSharedPreferences(PREFIX + name, mode); 
    } 
} 

Đặt SpecialisedMockContext to your test Ngữ cảnh ứng dụng. setContext(specialisedMockContext)createApplication().

+0

Tôi không chắc chắn tại sao câu trả lời này không nhận được bất kỳ upvotes; Tôi đã thêm của tôi. Nó chắc chắn tài liệu những gì tôi đã làm trong quá khứ và đã làm việc tốt cho tôi.Nếu bạn đã có một số lượng hạn chế các thiết bị thực, như hầu hết chúng ta làm, thì không gây ô nhiễm một tập hợp các sở thích là quan trọng đối với mã kiểm thử. –

+0

Bạn gọi 'setContext (specialisedMockContext) 'ở đâu? –

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