如何在robolectric中使用findViewById()

我只是想用robolectric进行testing,如果某个视图在片段中可见的话。 我的unit testing看起来像这样:

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); 

我正在使用最新的Android gradle插件1.1.3,robolectirc 2.4和robolectric gradle插件1.0.1,我的unit testing在test文件夹(而不是androidTest )。 我无法编译该代码,因为编译器无法parsingR.java

我的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 ... } 

我如何用robolectric编写这样的unit testing?

更新:这里是完整的代码:

 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> 

代码可以在这里find: https : //github.com/sockeqwe/RobolectircTest

Solutions Collecting From Web of "如何在robolectric中使用findViewById()"

更新:

我会build议继续并更新到Robolectric 3.0。

使用以下方式注释您的课程:

 @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

更新你的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' } } 

原版的:

使用Robolectric.buildActivity(FragmentActivity.class); 用于testingActivity

请编辑你的MyFragmentTest ,看起来像这样:

 @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); } }