Cómo utilizar findViewById () en robolectric

Simplemente quiero probar con robolectric si una determinada vista es visible en un fragmento. Mi prueba de unidad tiene este aspecto:

ActivityController controller = Robolectric.buildActivity(FragmentActivity.class); FragmentActivity activity = (FragmentActivity) controller.create().start().resume().visible().get(); F fragment = new MyFragment(); activity.getSupportFragmentManager().beginTransaction() .add(fragment, FRAGMENT_TAG).commit(); View view = fragment.getView().findViewById(R.id.my_view); assertEquals(view.getVisibility(), View.VISIBLE); 

Estoy utilizando la versión más reciente android gradle plugin 1.1.3, robolectirc 2.4 y robolectric gradle plugin 1.0.1 y mi unidad de prueba está en la carpeta de test (no androidTest ). No puedo compilar ese código, porque el compilador no puede resolver R.java .

Mi build.gradle :

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.1.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' } } apply plugin: 'com.android.library' apply plugin: 'com.neenbedankt.android-apt' apply plugin: 'org.robolectric' android { ... } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // Testing testCompile 'org.robolectric:robolectric:2.4' testCompile 'junit:junit:4.12' // Other dependencies ... } 

¿Cómo puedo escribir una prueba de unidad con robolectric?

Actualización: Aquí está el código completo:

 public class TestFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_listview_ptr, container, false); } } public class MyFragmentTest { private static final String FRAGMENT_TAG = "fragment"; private ActivityController controller; private FragmentActivity activity; @Test protected void displaysContentView(boolean pullToRefreshSupported) { controller = Robolectric.buildActivity(FragmentActivity.class); activity = (FragmentActivity) controller.create().start().resume().visible().get(); Fragment fragment = new TestFragment(); FragmentManager manager = activity.getSupportFragmentManager(); manager.beginTransaction() .add(fragment, FRAGMENT_TAG).commit(); // Compile errors here View loadingView = fragment.getView().findViewById(R.id.loadingView); View contentView = fragment.getView().findViewById(R.id.contentView); View errorView = fragment.getView().findViewById(R.id.loadingView); Assert.assertNotSame(loadingView.getVisibility(), View.VISIBLE); Assert.assertNotSame(errorView.getVisibility(), View.VISIBLE); Assert.assertEquals(contentView.getVisibility(), View.VISIBLE); } } <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/pull_to_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="#00000000" android:divider="@null" android:fadingEdge="none" android:fastScrollEnabled="false" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:listSelector="@color/transparent" android:drawSelectorOnTop="true" android:smoothScrollbar="false" android:scrollbars="none"/> </android.support.v4.widget.SwipeRefreshLayout> <TextView android:id="@+id/errorView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:text="@string/error_loading_retry" android:layout_gravity="center" android:gravity="center" android:layout_centerInParent="true" android:drawableTop="@drawable/error_no_connection" android:drawablePadding="12dp" android:textColor="@color/gray_dark" android:padding="16dp" /> <fr.castorflex.android.circularprogressbar.CircularProgressBar android:id="@+id/loadingView" android:layout_width="40dp" android:layout_height="40dp" android:indeterminate="true" android:layout_gravity="center" android:layout_centerInParent="true" android:visibility="gone" /> </FrameLayout> 

El código se puede encontrar aquí: https://github.com/sockeqwe/RobolectircTest

Actualizar:

Yo sugeriría seguir adelante y actualizar a Robolectric 3.0.

Anota tus clases con:

 @RunWith(CustomRobolectricRunner.class) @Config(emulateSdk = 21, reportSdk = 21) 

RobolectricGradleTestRunner.java:

https://github.com/nenick/AndroidStudioAndRobolectric/blob/master/app/src/test/java/com/example/myapplication/CustomRobolectricRunner.java

Actualice su build.gradle :

 apply plugin: 'com.android.application' // <-- for some reason, com.android.library is not working correctly apply plugin: 'org.robolectric' android { compileSdkVersion 22 buildToolsVersion "22.0.0" defaultConfig { minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile 'com.android.support:appcompat-v7:22.0.0' testCompile 'junit:junit:4.12' testCompile 'org.apache.maven:maven-ant-tasks:2.1.3' testCompile('org.robolectric:shadows-support-v4:3.0-SNAPSHOT') { exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'org.apache.httpcomponents', module: 'httpclient' } } 

Original:

Uso de Robolectric.buildActivity(FragmentActivity.class); Es para probar Activity s.

MyFragmentTest su MyFragmentTest para que se vea así:

 @RunWith(CustomRobolectricRunner.class) @Config(emulateSdk = 21, reportSdk = 21) public class MyFragmentTest { @Test public void testAppFragmentStart() { final TestFragment fragment = new TestFragment(); SupportFragmentTestUtil.startFragment(fragment, FragmentActivity.class); // My test examples - hamcrest matchers Assert.assertThat(fragment, CoreMatchers.not(CoreMatchers.nullValue())); Assert.assertThat(fragment.getView(), CoreMatchers.not(CoreMatchers.nullValue())); Assert.assertThat(fragment.getActivity(), CoreMatchers.not(CoreMatchers.nullValue())); Assert.assertThat(fragment.getActivity(), CoreMatchers.instanceOf(FragmentActivity.class)); // Your tests View loadingView = fragment.getView().findViewById(R.id.loadingView); View contentView = fragment.getView().findViewById(R.id.contentView); View errorView = fragment.getView().findViewById(R.id.errorView); Assert.assertNotSame(loadingView.getVisibility(), View.VISIBLE); Assert.assertNotSame(errorView.getVisibility(), View.VISIBLE); Assert.assertEquals(contentView.getVisibility(), View.VISIBLE); } } 
  • Estoy estudiando Robolectric pero se ha producido un error
  • Roboeléctrico con test.R.java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.