WaitForCondition () в классе Solo в Robotium использует объект Sleeper для спящего потока между проверкой состояния. Класс Sleeper имеет PAUSE, определяемый как 500 миллисекунд. Я хочу снизить это, в идеале, без загрузки исходного кода Robotium, изменения его и перекомпиляции Robotium.
Я попытался расширить класс Solo и построить собственный класс Waiter, который будет использовать пользовательский объект Sleeper с более низкими интервалами времени ожидания, но у официанта есть доступ на уровне пакета, поэтому этот маршрут недоступен.
Последнее ключевое слово в стороне, это сообщение фиксации, кажется, указывает, что пользовательские конфигурации должны быть (или приходят), но я не вижу никакого способа настроить эти константы в классе Solo.Config .
У кого-нибудь есть какие-то решения? Благодаря!
Обновление: ответ @ vRallev ниже выполняет работу с отражением. Я сделал запрос на загрузку, который сегодня был объединен с Robotium. В следующем выпуске вы сможете настроить время сна с помощью класса Config.
Даже если класс Waiter
или Sleeper
был общедоступным, вы не можете изменить значения. Причина в том, что поле waiter
в классе Solo
является окончательным, а конструктор, которому присвоено значение, является закрытым.
Единственный способ взломать это – с отражением. Я попробовал решение ниже, и он работает. Обратите внимание на пакет обоих классов!
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); } }