如何在 Robolectric 中单元测试 RecyclerView 和 LinearLayoutManager?

11
我该如何在Robolectric中对RecyclerView、ScrollListener和LinearLayoutManager进行单元测试?
我对这种类型的测试还比较新,但我真的想模拟手势,尤其是滚动。
1个回答

21

我猜你真正想测试的是你的代码,以及它在使用这些组件时是否表现符合期望。

由于你的问题范围比较广泛,让我举个例子:

假设你有一个带有RecyclerView的片段,并且该RecyclerView具有LinearLayoutManager。你想测试是否点击其中一项会触发另一层的正确方法调用。(假设你使用MVP,那就是Presenter)

一个可能的测试如下:

@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%满意,但如果您想要测试层间正确的通信,我认为这是合理的。


我之前使用了.measure.layout但是没有起作用,现在它可以工作了,谢谢。 - david
1
.measure和.layout允许我正确使用getAdapterPosition。 - Shooky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接