반응형
Robolectric으로 ViewPager (및 CursorLoader) 테스트
누구든지 Robolectric을 사용하여 다음 설정을 테스트하는 방법을 알고 있습니까?
CursorLoader로로드 된 데이터 인 ViewPager를 포함하는 조각입니다.
아래 코드를 사용하면 CursorLoader가 뷰 페이저의 어댑터로 푸시되지 않습니다. 나는 await()
전화에 갇혀있다 .
EventsFragmentTest.java :
@RunWith(CustomRobolectricTestRunner.class)
public class EventsFragmentTest extends AbstractDbAndUiDriver
{
// which element in the view pager we are testing
private static final int TEST_INDEX = 0;
protected SherlockFragmentActivity mActivity;
protected EventsFragment_ mFragment;
@Override
@Before
public void setUp() throws Exception
{
// create activity to hold the fragment
this.mActivity = CustomRobolectricTestRunner.getActivity();
// create and start the fragment
this.mFragment = new EventsFragment_();
}
@Test
public void sanityTest()
{
// create an event
final Event event = this.createEvent();
// create mock cursor loader
final Cursor cursor = this.createMockEventCursor(event);
this.mFragment.setCursorLoader(mock(CursorLoader.class));
when(this.mFragment.getCursorLoader().loadInBackground()).thenReturn(cursor);
CustomRobolectricTestRunner.startFragment(this.mActivity, this.mFragment);
await().atMost(5, SECONDS).until(this.isCursorLoaderLoaded(), equalTo(true));
// check for data displayed
final TextView title = this.getTextView(R.id.event_view_title);
final TextView text = this.getTextView(R.id.event_view_text);
// exists and visible is enough for now
this.getImageView(R.id.event_view_image);
assertThat(title.getText().toString(), equalTo(event.getTitle()));
assertThat(text.getText().toString(), is(event.getText()));
// clean up
cursor.close();
}
@Override
protected View getRootView()
{
return ((ViewPager) this.mFragment.getView().findViewById(R.id.events_pager)).getChildAt(TEST_INDEX);
}
private Callable<Boolean> isCursorLoaderLoaded()
{
return new Callable<Boolean>()
{
public Boolean call() throws Exception
{
return EventsFragmentTest.this.mFragment.isCursorLoaderLoaded(); // The condition that must be fulfilled
}
};
}
/**
* Create an event
*
* @return
*/
protected Event createEvent()
{
// create a random event
final Event event = new Event();
event.setImage(null);
event.setLink("/some/link/" + RandomUtils.getRandomString(5)); //$NON-NLS-1$
event.setResourceUri("/rest/uri/" + RandomUtils.getRandomDouble()); //$NON-NLS-1$
event.setText("this is a test object " + RandomUtils.getRandomString(5)); //$NON-NLS-1$
return event;
}
protected Cursor createMockEventCursor(final Event event)
{
// Create a mock cursor.
final Cursor cursor = new CursorWrapper(mock(MockCursor.class));
when(cursor.getCount()).thenReturn(1);
when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_TEXT))).thenReturn(event.getText());
when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_TITLE))).thenReturn(event.getTitle());
when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_IMAGE))).thenReturn(event.getImage());
when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_LINK))).thenReturn(event.getLink());
when(cursor.getString(cursor.getColumnIndexOrThrow(EventTable.COLUMN_RESOURCE_URI))).thenReturn(
event.getResourceUri());
// return created event
return cursor;
}
}
EventsFragment.java
@EFragment(resName = "events_fragment")
public class EventsFragment extends SherlockFragment implements LoaderCallbacks<Cursor>
{
@ViewById(R.id.events_pager)
protected ViewPager mPager;
@ViewById(R.id.events_indicator)
protected CirclePageIndicator mIndicator;
@Pref
protected ISharedPrefs_ mPreferences;
protected EventsFragmentAdapter pageAdapter;
private CursorLoader mCursorLoader;
/**
* initialise the cursoradapter and the cursor loader manager.
*/
@AfterViews
void init()
{
final SherlockFragmentActivity activity = this.getSherlockActivity();
this.pageAdapter = new EventsFragmentAdapter(activity.getSupportFragmentManager(), null);
this.mPager.setAdapter(this.pageAdapter);
this.mIndicator.setViewPager(this.mPager);
this.getLoaderManager().initLoader(this.mPager.getId(), null, this);
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, android.os.Bundle)
*/
@Override
public Loader<Cursor> onCreateLoader(final int arg0, final Bundle arg1)
{
if (this.mCursorLoader == null)
{
// set sort to newest first
final String sortOrder = BaseColumns._ID + " DESC"; //$NON-NLS-1$
this.mCursorLoader = new CursorLoader(this.getActivity(), EventContentProvider.CONTENT_URI,
EventTable.getProjection(), AbstractDbTable.getWhereCondition(null),
AbstractDbTable.getWhereArgs(this.mPreferences, null), sortOrder);
}
return this.mCursorLoader;
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader, java.lang.Object)
*/
@Override
public void onLoadFinished(final Loader<Cursor> arg0, final Cursor cursor)
{
this.pageAdapter.swapCursor(cursor);
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset(android.support.v4.content.Loader)
*/
@Override
public void onLoaderReset(final Loader<Cursor> arg0)
{
this.pageAdapter.swapCursor(null);
}
/**
* Required for testing only.
*
* @param cursorLoader
*/
public void setCursorLoader(final CursorLoader cursorLoader)
{
this.mCursorLoader = cursorLoader;
}
/**
* Required for testing only.
*
* @param cursorLoader
*/
public CursorLoader getCursorLoader()
{
return this.mCursorLoader;
}
public boolean isCursorLoaderLoaded()
{
return (this.pageAdapter.getCursor() != null);
}
}
확실하지는 않지만 내부 코드가 AsyncTask
커서 로더의 loadInBackground()
메서드 를 호출하기 위해 를 사용하려고합니다 . AsyncTask
호출을 시도하기 때문에 교착 상태가 발생할 수 있습니다 onPostExecute()
. 이 호출은 테스트 루틴의 스레드 인 기본 UI 스레드에서 실행을 시도합니다. 호출 스택에서 테스트 루틴이 대기 중이기 때문에 결코 일어날 수 없습니다.
Try moving your mocking up to a higher level so that nothing really happens in the background from the test. google `AsyncTask unit test android deadlock' to see examples where other people ran into similar problems.
참고URL : https://stackoverflow.com/questions/20346484/testing-viewpager-and-cursorloader-with-robolectric
반응형
'program story' 카테고리의 다른 글
카운터에 변수 "i"및 "j"가 사용되는 이유는 무엇입니까? (0) | 2020.09.04 |
---|---|
파일을 특정 개정으로 재설정하거나 되돌리려면 어떻게합니까? (0) | 2020.09.04 |
동일한 패키지에 roxygen2와 doxygen을 사용하십니까? (0) | 2020.09.04 |
즐겨 찾는 콘텐츠가 webview에 올바르게 표시되지 않습니다 (0) | 2020.09.04 |
범위 및 네비게이터 기능을 사용하여 Highcharts에서 열 범위 차트를 만드는 방법은 무엇입니까? (0) | 2020.09.04 |