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

时间:2016-03-10 22:52:19

标签: java android robotium

Robotium中的Solo类上的

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

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

除了最后一个关键字,this commit message似乎表明自定义配置应该(或即将到来)但我没有看到任何方法在Solo.Config class中自定义这些常量。

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

更新: @ vRallev的回答可以通过反射完成工作。我今天做了一个pull request合并到Robotium。在下一个版本中,您将能够使用Config类配置休眠时间。

1 个答案:

答案 0 :(得分: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();
  }
}

package com.robotium.solo;

public class SleeperHack extends Sleeper {

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