当前位置: 首页 > 知识库问答 >
问题:

如何在robolectric中使用findViewById()

高经艺
2023-03-14

我只是想用robolectric测试某个视图是否在片段中可见。我的单元测试如下所示:

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 Plugin1.1.3、Robolectirc2.4和robolectric gradle Plugin1.0.1,我的单元测试在test文件夹中(而不是Androidtest)。我无法编译该代码,因为编译器无法解析r.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
  ...
}

更新:以下是完整的代码:

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>

代码可以在这里找到:https://github.com/sockeqwe/robolectirctest

共有1个答案

梁学真
2023-03-14

我建议继续更新到Robolectric 3.0。

用以下语句注释类:

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

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);用于测试活动

请编辑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);
  }
}
 类似资料:
  • 我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法。我使用的是JUnit 4.8.2、Robolectric2.2、Mockito 1.9.5和PowerMock 1.9.5。由于我必须使用RoboElectricTestRunner,所以我尝试使用PowerMockRule来引导PowerMock。然而,当使用PowerMock运行测试时,不幸

  • 如何使用智能电子和PIT测试Android应用程序? 使用Robolectic,您可以在JVM中运行Android测试。使用PIT,您可以显示行覆盖范围并进行突变测试。对我来说,使用Eclipse插件是可以的,但没有要求。 这就是我迄今为止所尝试的: 我有一个Android项目,我们称之为MyProject。 我现在想在JVM中使用Robolectic和PIT测试MyProject。因此,我创建了

  • Robolectric 是一款Android单元测试框架,示例代码: @RunWith(RobolectricTestRunner.class)public class MyActivityTest { @Test public void clickingButton_shouldChangeResultsViewText() throws Exception { Activity ac

  • 根据这个链接,我可以创建一个测试应用程序,Robolectric将自动开始在测试中使用它。我不能让它运转起来。 我正在使用Dagger进行依赖注入,并为和创建了注入包装类。那么我的每个活动都扩展了包装器活动类,而不是简单的旧。

  • 使用Robolectric的参数化测试 原文链接 : Parameterized testing with Robolectric 译文出自 : 开发技术前线 www.devtf.cn 译者 : Lollypo 校对者: Chaos 状态 : 校对完成 在目前的项目中我们使用Robolectric为Android应用程序编写单元测试,它一直都干的不错。最近我需要编写一个测试用例,通过每次使用不同的

  • 我试图用RobolectRic2.1.1运行单元测试,但我无法让它膨胀自定义布局(例如,ViewPagerIndicator类)。假设这是我的布局: 其结果是: 我的最后一招是尝试使用影子类: 并使用。这再次导致 你们能给我指出正确的方向吗?我没主意了。多谢了。