我的活动的布局基本上是这样的(简化以说明问题)。基本上,如果设备有一个小屏幕,ListView
就没有太大的显示空间,因为其他视图占据了所有空间:
<LinearLayout orientation="vertical">
<SomeBigView
layout_width="match_parent"
layout_height="680dp"/>
<ListView
layout_width="match_parent"
layout_height="wrap_content" />
</LinearLayout>
我的活动代码按如下方式设置项目单击侦听器:
list.onItemClickListener = AdapterView.OnItemClickListener { _, view, _, _ ->
Snackbar.make(view, "Clicked on $view", Snackbar.LENGTH_SHORT).show()
}
我的单元测试点击列表中的第一项:
val controller = Robolectric.buildActivity(MainActivity::class.java)
.create().start().resume().visible()
val list: ListView = controller.get().findViewById(R.id.list)
shadowOf(list).performItemClick(0)
在Robolectric4.2.1中,使用非空
view
调用我的单击侦听器。在Robolectric4.3中,它是用
null
视图调用的。 最佳答案
总结:
解决方案是使用@Config(qualifiers="h780dp")
注释为该测试指定更大的设备高度。
细节:
经过调试,我发现Robolectric4.2.1的ListView
高度是146
(top=680
,bottom=826
),而Robolectric4.3的0
(top=680
,bottom=680
)。robolectric使用的默认设备高度是470
,这不足以显示列表。该列表没有Robolectric 4.3的任何子视图。
在Robolectric的shadowOf(list).performItemClick(0)
中可以找到ShadowAdapterView
的实现,它是:
public boolean performItemClick(int position) {
return realAdapterView.performItemClick(realAdapterView.getChildAt(position),
position, realAdapterView.getItemIdAtPosition(position));
}
对于Robolectric 4.3,
getChildAt(position)
返回null
,这是转发给单击侦听器的内容。解决方法是为此测试指定一个更大的设备屏幕。例如:
@Test
@Config(qualifiers="h780dp")