Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Prueba de ViewPager (y CursorLoader) con Robolectric

¿Alguien sabe cómo probar la siguiente configuración con Robolectric?

Fragmento que contiene un ViewPager, datos cargados con un CursorLoader.

Con el código siguiente, el CursorLoader nunca se inserta en el adaptador para el buscapersonas de vista. Me quedo atascado en la llamada de 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); } } 

  • ¿Cómo puedo sombrear el PackageManager con Robolectric
  • Gradle Robolectric Resources NotFoundException en pruebas
  • './gradlew -Dtest.single = SimpleTest test' ejecuta todas las pruebas que tengo
  • Android Studio - Robolectric: android.content.res.Resources $ NotFoundException: ninguna etiqueta como com.my.app:string/app_name
  • Prueba de AsyncTaskLoaders con Robolectric
  • ¿Robolectric soporta el nivel API?
  • No se puede crear ActionBarActivity desde Robolectric 2 unidad de prueba
  • Android: Unidad de pruebas de aplicaciones Android con Robolectric y Mockito
  • One Solution collect form web for “Prueba de ViewPager (y CursorLoader) con Robolectric”

    No estoy seguro, pero apostaría que el código interno está intentando utilizar un AsyncTask para invocar el loadInBackground() del cargador del cursor. Es posible que esté viendo un interbloqueo porque el AsyncTask intenta invocar onPostExecute() . Esa llamada intentará ejecutarse en su hilo principal de interfaz de usuario, que pasa a ser el hilo de la rutina de prueba. Eso nunca puede suceder porque usted está atrapado en una espera con su rutina de prueba en la pila de llamadas.

    Trate de mover su burla a un nivel superior para que nada suceda realmente en el fondo de la prueba. Google 'AsyncTask unidad de prueba de bloqueo androide' para ver ejemplos donde otras personas se enfrentan a problemas similares.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.