重点是performClick和hideSoftKeyboard。
  1. 为什么Robotium要这么做呢?
  如果不这么做,editText.setText(msg)也成功。但这和真实操作不一致,真实流程是:点击editText,弹出键盘,输入文字,隐藏键盘。虽然这个流程短,但状态变化很大:
  焦点发生变化,这可能会影响后续的检查/业务流程(触发事件之类…)。
  弹出/隐藏键盘,这会触发Android从Touch模式变为键盘模式。另外弹出/隐藏键盘可能有监听事件,如不触发操作,监听事件不会执行。
  2. 为什么要在setText之前hideSoftKeyboard?
  如果performClick和hideSoftKeyboard是上面的原因,那么hideSoftKeyboard在setText之前/后都没所谓了,因为他压根不影响输入。
  3. 如果不执行hideSoftKeyboard会怎么样?
  隐藏键盘的监听事件不执行。
  Android将停留在键盘模式。
  重要的是:不藏起来,键盘一直占了半个屏啊,Robotium要可视控件才能操作,弹出键盘可能会影响其他控件的操作。
  这么说,Robotium在enterText的时候做performClick和hideSoftKeyboard是很合理的。
  回到之前的问题,为什么它会导致“信息发送失败”呢?
  因为这个产品设计是,藏起键盘时,bottom_bar会回退到初始状态。如图:

  bottom_bar初始状态时,是没有输入框和发送按钮的。先不管edit和btn有没被GC,光控件不可视,click操作会失败。至于成功/失败随机,是因为hideSoftKeyboard事件响应和click速度参差造成的。
  只能说这种应用场景下,Robotium表示无能为力。
  解决方案:
  对Robotium进行扩展,实施额外enterText接口,但这会对日后升级Robotium带来不便。
  修改案例避免问题。