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

Mar*_*ark 6 java android robotium

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

我尝试扩展Solo类并构建我自己的Waiter类,该类将使用具有较低睡眠间隔的自定义Sleeper对象,但Waiter具有包级访问权限,因此此路由不可用.

除了最后的关键字,这个提交消息似乎表明自定义配置应该(或即将到来),但我没有看到任何方法在Solo.Config类中自定义这些常量.

有没有人有任何解决方案?谢谢!

更新: @ vRallev在下面的答案通过反射完成工作.我做了一个拉动请求,今天合并到了Robotium.在下一个版本中,您将能够使用Config类配置休眠时间.

vRa*_*lev 5

即使该类WaiterSleeper类是公开的,您也无法更改这些值.原因是类中的waiter字段Solo是final,并且赋值的构造函数是private.

破解这一点的唯一方法就是反思.我试过下面的解决方案,它的工作原理.注意两个类的包!

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

package com.robotium.solo;

public class SleeperHack extends Sleeper {

  @Override
  public void sleep() {
    sleep(50);
  }
}
Run Code Online (Sandbox Code Playgroud)