Robotium - 在Sleeper类中自定义PAUSE持续时间

6

Robotium中的Solo类中的waitForCondition()使用Sleeper对象在检查条件之间使线程休眠。Sleeper类定义了PAUSE为500毫秒。我想将其降低,最好不需要下载Robotium源代码,更改并重新编译Robotium。

我尝试扩展Solo类并构建自己的Waiter类,该类将使用具有较短睡眠间隔的自定义Sleeper对象,但是Waiter只能在包级别访问,因此无法使用这种方法。

除了final关键字,这个提交信息似乎表明应该(或即将)提供自定义配置,但我没有看到任何方式可以自定义Solo.Config class中的这些常量。

有人有解决方案吗?谢谢!

更新: @vRallev的下面答案使用反射完成了这项工作。我提交了一个拉取请求,它已合并到Robotium中。在下一个版本中,您将能够使用Config类配置睡眠时间。


如果你只想覆盖“waitForCondition”的休眠时间而不是所有等待函数,那么为什么不创建自己的等待函数呢? - Kit Fung
因为那样我实际上会做我说过不想做的事情:拿Robotium源代码,进行更改和重新编译。 - Mark
我是说你可以在一个新的自定义类中创建一个新的函数,而不是编辑源代码。 "waitForCondition" 的逻辑非常清晰易懂,很容易实现。它不需要重新编译。 - Kit Fung
1个回答

5
即使 WaiterSleeper 类是 public 的,也无法更改其值。原因是 Solo 类中的 waiter 字段是 final 的,并且赋值的构造函数是私有的。

唯一的黑客方法是使用反射。我尝试了以下解决方案并且可行。请注意两个类的包名!

package com.robotium.solo;

import java.lang.reflect.Field;

public class SoloHack {

  private final Solo mSolo;

  public SoloHack(Solo solo) {
    mSolo = solo;
  }

  public void hack() throws NoSuchFieldException, IllegalAccessException {
    Field field = mSolo.waiter.getClass().getDeclaredField("sleeper");
    field.setAccessible(true);

    // Object value = field.get(mSolo.waiter);
    // Class<?> aClass = value.getClass();

    field.set(mSolo.waiter, new SleeperHack());

    // Object newValue = field.get(mSolo.waiter);
    // Class<?> newClass = newValue.getClass();
  }
}

并且
package com.robotium.solo;

public class SleeperHack extends Sleeper {

  @Override
  public void sleep() {
    sleep(50);
  }
}

太棒了!非常感谢! - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接