我特别需要编写如下测试:
@RunWith(RobolectricTestRunner.class)
public class LongClickTest {
@Test
public void testPerformLongClick() {
View view = new View(Robolectric.application);
view.performLongClick();
}
}
但它给了我以下错误:
java.lang.NullPointerException
at android.view.View.showContextMenu(View.java:4154)
at android.view.View.performLongClick(View.java:4123)
at org.robobinding.widget.view.OnLongClickAttributeTest.longClickOnView(OnLongClickAttributeTest.java:34)
at org.robobinding.widget.view.OnLongClickAttributeTest.givenBoundAttribute_whenLongClickOnView_thenEventReceived(OnLongClickAttributeTest.java:27)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:250)
...
我在Robolectric本身检查了一个类似的测试org.robolectric.shadows.ViewTest.performLongClick_shouldClickOnView,但我无法弄清楚为什么Robolectric的工作和我的工作没有。顺便说一下,我正在使用Robolectric 2.3。
感谢您的帮助!
谢谢, 程
答案 0 :(得分:2)
你应该做shadowOf(查看).performLongClick。
此外,这可能不是创建您感兴趣的视图的最佳方式。请尝试
view = new View(new Activity());
或使用LayoutInflater。
stacktrace表示问题在于创建上下文菜单,这是长按的默认行为。机器人测试工作失败的原因是它们覆盖了onLongClickListener。 所以试试这样的事情:
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
关键是要返回true,以便不要调用上下文菜单,如果你想单独测试它。
答案 1 :(得分:0)
我正在测试上下文菜单。从listView的一行调用它。这就是我的方法(在Kotlin中):
val activity = buildActivity(MyActivity::class.java).create().get()
val customView = LayoutInflater.from(activity)
.inflate(R.layout.custom_xml, activity.my_list_view, false)
as MyCustomView
val linearLayout = activity.my_list_view.parent as LinearLayout
linearLayout.addView(customView)
现在performClick可以使用了。我只需要学习如何获取上下文菜单来测试该菜单即可!