2010-07-26 4 views
17

Context, 타사 라이브러리 및 을 PreferenceManager에서 작성한 클래스를 작성했습니다.안드로이드에서 PreferenceManager 모의?

Context을 모의 할 수 있으며 제 3 자 라이브러리는 일부 조롱 프레임 워크를 사용하여 조롱받을 수 있지만 PreferenceManager과 어떻게해야하나요?

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

및 해당한다는 부하 환경 설정 :

나는 두 가지 방법이있다.

+10

'PreferenceManager'에서 조롱 할 필요가있는 특정 동작이 있습니까? 그렇지 않으면 테스트 환경 설정 코드가'AndroidTestCase'에서 잘 작동합니다. –

+1

나는 의견을 받아 들일 수 없다는 것은 수치 스럽다. 그러나 당신이 쓴 것은 나를 만족시킨다. – pixel

답변

5

모의 인스턴스가 PreferenceManager (실제로는 PreferenceFragment 또는 PreferenceActivity에 사용됨)을 실제로 원하는 것처럼 보이지 않습니다.

  1. 모의 SharedPreferences,이 경우 당신은 단지 (어쨌든 PreferenceManager#getDefaultSharedPreferences에 의해 호출되는) Context#getSharedPreferences을 조롱 할 수 있습니다

    당신은 아마 중 하나를합니다. 위와 같이 환경 설정을 편집하는 경우 모의도 만들어야합니다 (SharedPreferences.Editor). 당신은 컨텍스트를 조롱하는 방법을 이미 알고 있다고 말하면, 이것은 매우 간단해야합니다.

  2. 환경의 실제 환경 설정을 사용합니다. 이것은 가장 쉽고 반드시 나쁜 생각은 아닙니다. 테스트가 서로 방해하지 않도록 (또는 테스트 환경에 따라 앱을 수동으로 사용하여 영향을받지 않도록) 올바르게 정리되었는지 확인하십시오.

당신이 정말로 이 (당신이 PreferenceFragment 또는 PreferenceActivity에서 얻을처럼), 당신이 절대적으로 그렇게 할 수 PreferenceManager 인스턴스를 조롱하려는 경우.

최종본이 아니므로 평소와 같이 코드를 제공 할 수있는 곳이면 어디서나 코드를 제공 할 수 있다면 Mockito (또는 다른 조롱 라이브러리)를 사용하여 mock PreferenceManagerSharedPreferences을 생성 할 수 있습니다 (비 테스트시 코드는 일반적으로 getPreferenceManager()에서 온 것입니다.

+1

'Context # getSharedPreferences'는 파일 이름을 전달해야합니다. –

2

공유 환경 설정에 특수한 컨텍스트를 사용할 수 있습니다. RenamingDelegatingContext은 모든 것을 컨텍스트에 위임합니다. Context에서 SharedPreference에 액세스하면 getSharedPreferences(String name, int mode)을 사용합니다.

여기서 RenamingDelegatingContext을 확장하면 getSharedPreferences를 대체하고 test PREFIX으로 name 매개 변수를 가장합니다. 따라서 테스트를 실행할 때 주 응용 프로그램과 다른 기본 설정 파일에 기록합니다.

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

이 SpecialisedMockContext를 테스트 응용 프로그램 컨텍스트로 설정하십시오. setContext(specialisedMockContext)createApplication().

+0

나는 왜이 답변이 어떤 상향 보를 얻지 못하는지 확신하지 못한다. 나는 내 것을 추가했다. 그것은 내가 과거에 한 일을 분명히 문서화하고 나를 위해 잘 작동했습니다.대부분의 사용자가 그러 하듯이 실제 장치의 안정성이 제한적이라면 테스트 코드에 대한 작업 환경 설정을 중요하게 고려해야합니다. –

+0

어디에서'setContext (specialisedMockContext) '를 호출합니까? –