böyle basit bir ListFragment geliştiriyorum Verilen (bu durumda, bu Mediastore gelen Sanatçıların bir listesini okur, aynı zamanda daha sonra farklı bir kaynaktan gelen verileri okuyacak):Robolectric & Mockito
@EFragment
public class ArtistsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = ArtistsFragment.class.getName();
private SimpleCursorAdapter mAdapter;
Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
CursorLoader mCursorLoader;
@AfterViews
void setupView() {
mAdapter = new SimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_1, null,
new String[]{MediaStore.Audio.Artists.ARTIST}, // lists path of files
new int[]{android.R.id.text1}, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (mCursorLoader == null) {
mCursorLoader = new CursorLoader(getActivity(), uri, new String[]{MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST},
null, null, MediaStore.Audio.Artists.ARTIST + " ASC");
} else {
System.out.println("mCursorLoader.count: " + mCursorLoader.loadInBackground().getCount());
}
return mCursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
setListShown(true);
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
Ben Fragment çeşitli koşullara uygun şekilde davranır ispat (örn boş liste veya geçersiz veri vs) için Robolectric + Mockito + awaitility kullanmak istiyorum. Benim test sınıf şuna benzer:
@RunWith(RobolectricTestRunner.class)
public class ArtistsFragmentTest {
@Test
public void shouldNotBeNull() {
final ArtistsFragment myFragment = ArtistsFragment_.builder().build();
assertNotNull(myFragment);
// Create a mock cursor.
final Cursor mc = getSampleArtistCursor();
when(mc.getCount()).thenReturn(1);
when(mc.getInt(0)).thenReturn(1);
when(mc.getString(1)).thenReturn("Sample Title");
myFragment.mCursorLoader = mock(CursorLoader.class);
when(myFragment.mCursorLoader.loadInBackground()).thenReturn(mc);
startFragment(myFragment);
assertNotNull(myFragment.getListView());
await().atMost(5, TimeUnit.SECONDS).until(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return myFragment.getListAdapter().getCount();
}
}, equalTo(1));
System.out.println(myFragment.getListAdapter().getCount());
}
private Cursor getSampleArtistCursor() {
return new CursorWrapper(mock(MockCursor.class));
}
}
Sonra IntelliJ bu testi çalıştıran veya test başarısız olur maven zaman, adaptör hep sıfır sayısını döndürür.
onCreateLoader'daki System.out.println ifadesi, 'u döndürür. background thread içinde Mockito'ya özel dikkat göstermem gerekiyor mu? (loadInBackground yöntemi bir çalışan iş parçacığı üzerinde çalışır).
Çalışan Birim test sınıfını tamamlamanızı sağlayabilir misiniz? Aynı problemle karşılaşıyorum ve aynı imleç kullanıyorum. – user2566484