如何在Robolectric中对RecyclerView,LinearLayoutManager进行单元测试?

时间:2016-03-16 15:07:25

标签: android android-recyclerview robolectric

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

我对这种测试还不熟悉,但我真的很想模仿手势,特别是滚动。

1 个答案:

答案 0 :(得分:14)

我猜你真正想要测试的是你的代码,如果它使用这些组件表现得很好。

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

假设你有一个带有RecyclerView的片段,它有一个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%满意,但我认为如果你不想测试你的图层的正确沟通是合理的。