android - 测试 RecyclerView 适配器

标签 android unit-testing android-espresso

我有一个基础 RecyclerViewAdapter 我想独立于我的各种子类进行测试。我如何孤立地做到这一点?我尝试在我的测试类中创建一个精简的 Vanilla Activity,并使用 ActivityTestRule 启动它,但不幸的是,测试框架似乎想要启动实际应用程序而不是测试应用程序中的 Activity 。我不想为此求助于 Robolectric,因为我们的团队致力于使用 Espresso 进行仪器测试。我真正想要测试的是适配器中各种 notify 方法的行为,因为我看到了崩溃

android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition

最佳答案

我最终通过在 debug 文件夹中添加一个虚拟 Activity 来解决这个问题,然后在我的测试代码中手动将一个 RecyclerView 添加到 Activity 中,然后将适配器设置为我想单独测试它。当应用编译 list 合并时,将合并在调试文件夹中的 AndroidManifest.xml 中声明的所有 Activity 。

这是我的测试设置代码:

@RunWith(AndroidJUnit4.class)
public class MyRecyclerViewAdapterTest {

    private MyRecyclerViewAdapter adapter;
    private RecyclerView recyclerView;

    @Rule
    public ActivityTestRule<DummyActivity> activityTestRule =
        new ActivityTestRule<>(DummyActivity.class, true, false);

    @Rule
    public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();

    @Before
    public void setup() throws Throwable {
        final DummyActivity activity = activityTestRule.launchActivity(null);

        uiThreadTestRule.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter = new MyRecyclerViewAdapter(activity);
                recyclerView = new RecyclerView(activity);
                recyclerView.setId(R.id.recycler_view);
                activity.setContentView(recyclerView);
                recyclerView.setLayoutManager(new LinearLayoutManager(activity));
                recyclerView.setAdapter(adapter);
            }
        });
    }
}

并在 /src/debug/AndroidManifest.xml 中声明虚拟 Activity:

<activity android:name="com.example.DummyActivity" />

虚拟 Activity 很简单:

// Dummy Activity for testing
public class DummyActivity extends Activity {
}

关于android - 测试 RecyclerView 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42079391/

相关文章:

android - 安装 OpenGL ES 并为 android 编译代码

android - 错误: list 合并失败:android中的属性application @ appComponentFactory

angular - NgRx 测试 - 检查分派(dispatch) Action 的顺序

java - 在 IntelliJ 中创建测试类

c++ - 如何在 googlemock 中创建部分(混合)模拟?

android在android中锁定home键和返回键

android - 摘下耳机时如何停止音乐播放器?

android - 如何在Android中测试基于Espresso的Intent?

android - 在多进程 Android 应用程序中注入(inject)依赖项

android - 在@Before 中清除应用程序数据后测试用例失败