如何在Robotium测试中使用SeekBar模拟用户交互(“fromUser = true”)?

时间:2014-06-18 15:39:14

标签: android robotium

我的代码使用传递给onProgressChanged()方法的fromUser参数来区分用户和代码与SeekBar的交互:

        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean fromUser) {

            if (fromUser) {
                // execute only if it was user interaction with the SeekBar
                ...
            }
        }

当我尝试使用robotium测试我的SeekBar时,我无法“模拟用户与SeekBar的交互”:

 solo.setProgressBar(mSeekBar, newValue);
使用fromUser == false执行

onProgressChanged()回调。

是否可以编写Robotium测试来设置SeekBar的进度并同时模拟用户交互(fromUser == true)?

谢谢!

2 个答案:

答案 0 :(得分:5)

解决方案(反思)

SeekBarProgressBar的间接子类,它有一个公共setProgress(int),只有一行调用包方法setProgress(int, boolean)并将fromser == false传递给它。可以使用Reflections并直接调用setProgress(int, boolean)并传递所需的fromUser参数:

    private void setSeekBarProgress(int newProgress, boolean fromUser) {

        Method privateSetProgressMethod = null;

        try {
            privateSetProgressMethod = ProgressBar.class.getDeclaredMethod("setProgress", Integer.TYPE, Boolean.TYPE);
            privateSetProgressMethod.setAccessible(true);
            privateSetProgressMethod.invoke(mSeekBar, newProgress, fromUser);
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
            fail("Error while invoking private method.");
        }
    }

答案 1 :(得分:1)

使用方法setProgressBar无法实现这一点,因为它使用setProgress中的ProgressBar.setProgress,因此默认情况下将fromUser设置为false。

  1. 解决方案是使用点击屏幕 - 但实际上你根本不知道你在哪个点(进度的百分比),如果你点击了进度条。

  2. 解决方案是使用反射 - 使用带有额外参数的setProgress方法(fromUser),因此它将使用protected方法。如果您遇到问题,我可以帮助您实施。

  3. 解决方案是让机器人团队从第二点开始实施方法。