android - 如何在 Robolectric 中对 RecyclerView 和 LinearLayoutManager 进行单元测试?

标签 android android-recyclerview robolectric

如何在 Robolectric 中对 RecyclerView、ScrollListener 和 LinearLayoutManager 进行单元测试?

我对这种测试还很陌生,但我真的很想模仿手势,尤其是滚动。

最佳答案

我想您真正不想测试的是您的代码,以及它是否按预期使用这些组件运行。

由于你的问题范围很广,让我给它一个用例。:

假设您有一个带有 RecyclerView 的 fragment ,它有一个 LinearLayoutManager。您想要测试单击其中一项是否会触发对另一层的正确方法调用。 (假设您使用 MVP,那就是演示者)

一个可能的测试看起来像这样:

@RunWith(RobolectricGradleTestRunner::class)
@Config(constants = BuildConfig::class, sdk = intArrayOf(21))
class MyFragmentTest {

lateinit var fragment: MyFragment
lateinit var activityController: ActivityController<FragmentActivity>

@Before
@Throws(Exception::class)
fun setUp() {
    fragment = MyFragment()

    activityController = Robolectric.buildActivity(FragmentActivity::class.java)

    activityController.create().start().resume()

    activityController.get()
            .supportFragmentManager
            .beginTransaction()
            .add(fragment, null)
            .commit()
}

@Test
@Throws(Exception::class)
fun testClickEntry() {
    val recycler = fragment.view!!.findViewById(R.id.sideNavigationRecycler) as RecyclerView
    // workaround robolectric recyclerView issue
    recycler.measure(0,0)
    recycler.layout(0,0,100,1000)

    // lets just imply a certain item at position 0 for simplicity
    recycler.findViewHolderForAdapterPosition(0).itemView.performClick()

    // presenter is injected in my case, how this verification happens depends on how you manage your dependencies. 
    verify(fragment.presenter).onEntryClicked(MyNavigationEntry.XYZ)
}
}

首先对语法感到抱歉,我在测试中使用 Kotlin。

我不得不说,虽然我自己对此不是 100% 满意,但我认为如果您不想测试层之间的正确通信,这是合理的。

关于android - 如何在 Robolectric 中对 RecyclerView 和 LinearLayoutManager 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36039575/

相关文章:

android - Sharepreference来存储int值

android - Fragment 的 onResume() 中的 getview()

java - 使用支持新旧 Android 版本的剪贴板管理器进行复制?

android - java.lang.IllegalStateException : Activity has been destroyed 错误

android - 在android编程中使用资源id

android - 从另一个 fragment 的适配器刷新 RecyclerView fragment

android - 5.0 之前如何让 CardView 无缝堆叠(如 Gmail 的 Inbox)

android - 每行具有不同 spanCount 的 RecyclerView

android - 在 Android 中测试 AutoCompleteTextView

android - Robolectric 不会与 SecretKeyFactory.getInstance(KEYGEN_ALGORITHM) 一起运行