9

이미지 용 MediaStore를 쿼리하는 클래스가 있습니다. 예를 들어 someContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ...)과 같은 코드가 있습니다. 다른 것들 중에서도 MediaStore에 대한 내 쿼리가 정확하다는 것을 테스트하고 싶습니다. 나는 내 테스트에서 지금까지했던 어떤robolectric를 사용하여 MediaStore를 테스트 이중으로 대체 할 수 있습니까?

은 이것이다 :

ContentResolver resolver = new Activity().getContentResolver(); 
ContentValues values = new ContentValues(); 
values.put(MediaStore.Images.Media.DATA, 
      "/fake/path/file1.jpg"); 
values.put(MediaStore.Images.Media.DATE_ADDED, 
      fakeTime.getTime()); 
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       values); 

나는 그것에 쿼리를 수행 내 클래스에이 해결을 주입. 그러나 쿼리는 null을 반환합니다. 이 게시물보고 : ShadowContentResolver를 사용하여 콘텐츠 공급자를 등록 말한다 http://ikaruga2.wordpress.com/2013/07/29/roboelectric-and-contentresolverscontentproviders/을, 그래서 뭔가 같은 :

ShadowContentResolver.registerProvider(MediaStore.AUTHORITY, <SOMETHING_GOES_HERE>); 

하지만 콘텐츠 공급자에 대한 넣어 모르겠어요. 어쩌면 MediaStore 개체를 사용합니까? 아니요, ContentProvider이 아닙니다. 아마도 그것은 MediaProvider입니까? 웬일인지 기호를 확인할 수 없습니다.

이 시점에서 저는 이것이 원격으로 정확한 접근법이라는 사실에 심각한 의문을 가지고 있습니다. 누군가 나를 올바른 방향으로 인도 할 수 있습니까?

는 Robolectric 2.4 스냅 샷 및 API 나는 미디어 스토어 MediaStore와 유사한 문제가 된 19

+0

아직 해결 방법을 찾았습니까? –

+0

@SebastianRoth 아니요, 아닙니다. – Kevin

답변

0

를 사용하여, 내 경우에는 클래스는 managedQuery를 통해 미디어 스토어 MediaStore에 액세스하려고. 이러한 코드 경로를 통과 한 테스트를 실행하면 NPE를 사용하여 테스트가 실패했습니다. 쿼리가 사용자의 경우와 마찬가지로 null을 반환했기 때문입니다.

이미 (내 프로젝트에 단검과 의존성 주입)은 예를 들어 Mockito를 통해 (당신을 맞는 경우 해결, 당신은 그것을 조롱하거나 할 수 있습니다 주입되는 것을 감안할 때 기분을 상하게하는 방법

public String getPath(Uri uri, Activity activity) { 
    String[] projection = { MediaColumns.DATA }; 
    Cursor cursor = activity 
      .managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

), 또는 부분적으로 그것을 모의하므로, 문제가되는 메소드는 사용 가능한 반환 값을 기본값으로 사용합니다.

PhotoUtilities pu=Mockito.spy(new PhotoUtilities()); 
Mockito.doReturn(Constants.getDataDir().getAbsolutePath()+"/aaa.txt"). 
when(pu).getPath(Mockito.isA(Uri.class), Mockito.isA(Activity.class)); 

이 방법을 테스트 getPath()를 실행 시도 할 때, 그것은 쿼리를 실행하지,하지만 테스트에 갈 수 있도록 부분 모의에 설정된 기본 반환 값을 사용합니다.

나는 그것이 당신이 정확히 찾고있는 것이 아닐 수도 있지만 그것은 나를 위해했던 것처럼 당신의 필요에 맞을 수도 있다는 것을 알고 있습니다.

+0

실제로 쿼리의 유효성을 검사하고 싶습니다. 응답 주셔서 감사합니다! – Kevin

1

ShadowContentResolver.setCursor(Uri, BaseCursor)RoboCursor을 사용하여 테스트 데이터를 만들고 쿼리를 확인할 수 있습니다. RoboCursor은 몇 가지 메소드의 전체 구현을 제공하지 않으므로 무시하거나 무시하거나 의미있는 작업을 수행 할 수 있습니다. RoboCursorBaseCursor을 확장하며 setQuery()을 무시하면 쿼리를 가로 채서 확인하거나 처리 할 수 ​​있습니다. Robolectric 3.0 사용하기.

RoboCursor cursor = new RoboCursor() { 
    @Override 
    public void registerContentObserver(ContentObserver observer) { 
     // no op 
    } 

    @Override 
    public void unregisterContentObserver(ContentObserver observer) { 
     // no op 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     // no op 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
     // no op 
    } 

    @Override 
    public boolean isClosed() { 
     return true; 
    } 
}; 
cursor.setColumnNames(Arrays.asList(MediaStore.Images.Media._ID, 
     MediaStore.Images.Media.BUCKET_DISPLAY_NAME)); 
cursor.setResults(new Object[][]{ 
     new Object[]{1L, "WhatsApp"}, 
     new Object[]{2L, "Photos"}, 
     new Object[]{3L, "WhatsApp"} 
}); 
shadowOf(ShadowApplication.getInstance().getContentResolver()) 
     .setCursor(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor); 
관련 문제