如何在Robotium测试中模拟用户与SeekBar的交互("fromUser=true")?

问题描述 投票:2回答:2

我的代码使用传递给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);

onProgressChanged()回调在fromUser == false的情况下被执行。

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

谢谢!我的代码区分了用户和代码的交互。

android robotium
2个回答
1
投票

你不能用setProgressBar方法来实现这一点,因为它使用的是 设置进度ProgressBar.setProgress 所以默认fromUser设置为false。

  1. 解决方法是使用点击屏幕--但实际上你并不知道你到底点击了哪一点(进度百分比),如果你点击了进度条的话。

  2. 解决方法是使用反射--使用setProgress方法加上额外的参数(fromUser),这样它就会使用受保护的方法。如果你有问题,我可以帮助你实现这个方法。

  3. 解决方法是请robotium团队实现第二点的方法。


5
投票

解决方案(思考

寻巴 的间接子类。进度条 属于公共 setProgress(int) 只有一行调用包方法 setProgress(int, boolean) 并将fromUser == 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.");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.