2016-03-10 4 views
6

waitForCondition() w klasie Solo w Robotium używa obiektu Sleeper do przespania wątku pomiędzy sprawdzaniem stanu. Klasa Sleeper ma PAUSE zdefiniowaną jako 500 milisekund. Chcę to obniżyć, najlepiej bez pobierania kodu źródłowego Robotium, zmieniania go i rekompilacji Robotium.Robotium - dostosuj czas trwania PAUSE w klasie Sleeper

Próbowałem rozszerzyć klasę Solo i zbudować własną klasę kelnerów, która używałaby niestandardowego obiektu Sleeper z mniejszymi przerwami na sen, ale Kelner ma dostęp na poziomie pakietu, więc ta trasa nie jest dostępna.

Ostatnie słowo kluczowe na bok, this commit message, wydaje się wskazywać, że niestandardowe konfiguracje powinny być (lub nadchodzą), ale nie widzę żadnego sposobu dostosowania tych stałych w Solo.Config class.

Czy ktoś ma jakieś rozwiązania? Dzięki!

Aktualizacja: @ vRallev's odpowiedź poniżej wykonuje zadanie z refleksji. Zrobiłem pull request, który został dzisiaj połączony z Robotium. W następnym wydaniu będzie można skonfigurować czasy uśpienia za pomocą klasy Config.

+0

jeśli tylko chcesz nadpisać czas uśpienia „waitForCondition” zamiast czekać functoin wszystko, dlaczego nie można po prostu stworzyć własną funkcję czekać? –

+0

Ponieważ wtedy skutecznie robiłbym to, co powiedziałem, że nie chciałem: zabrać kodu źródłowego Robotium, zmienić go i rekompilować. – Mark

+0

Mam na myśli to, że można utworzyć nową funkcję w nowej klasie niestandardowej zamiast edytować kod źródłowy. Logika "waitForCondition" jest dość przejrzysta i łatwa do wdrożenia. To nie będzie wymagać rekompilacji. –

Odpowiedz

5

Nawet jeśli klasa Waiter lub Sleeper była jawna, nie można zmienić wartości. Powodem jest to, że pole waiter w klasie Solo jest ostateczne, a konstruktor, do którego przypisana jest wartość, jest prywatny.

Jedynym sposobem na zhackowanie tego jest odbicie. Wypróbowałem rozwiązanie poniżej i działa. Zwróć uwagę na pakiet obu klas!

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(); 
    } 
} 

I

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

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

Niesamowite rozwiązanie! Dziękuję bardzo! – Mark

Powiązane problemy