2016-03-10 16 views
6

waitForCondition() in der Solo-Klasse in Robotium verwendet ein Sleeper-Objekt, um einen Thread zwischen der Überprüfung einer Bedingung zu speichern. Die Sleeper-Klasse hat eine PAUSE, die als 500 Millisekunden definiert ist. Ich möchte das senken, idealerweise ohne den Robotium-Quellcode herunterzuladen, zu ändern und Robotium neu zu kompilieren.Robotium - Anpassen der PAUSE-Dauer in der Sleeper-Klasse

Ich habe versucht, die Solo-Klasse zu erweitern und meine eigene Waiter-Klasse zu erstellen, die ein benutzerdefiniertes Sleeper-Objekt mit niedrigeren Schlafintervallen verwenden würde, aber Waiter hat Zugriff auf Paketebene, sodass diese Route nicht verfügbar ist.

Das letzte Schlüsselwort beiseite, this commit message scheint anzuzeigen, dass benutzerdefinierte Konfigurationen sein sollten (oder kommen), aber ich sehe keine Möglichkeit, diese Konstanten in Solo.Config class anzupassen.

Hat jemand irgendwelche Lösungen? Vielen Dank!

Update: @ vRallev die Antwort unten erhält den Job mit Reflektion getan. Ich machte eine pull request, die heute in Robotium zusammengeführt wurde. In der nächsten Version können Sie die Ruhezeiten mit der Config-Klasse konfigurieren.

+0

, wenn Sie nur die Ruhezeit von „WAITFORCONDITION“ statt alle functoin warten zu überschreiben, warum Sie nicht nur Ihre eigene Wartefunktion erstellen? –

+0

Weil ich dann tatsächlich tun würde, was ich gesagt habe, was ich nicht tun wollte: den Quellcode von Robotium zu nehmen, ihn zu ändern und neu zu kompilieren. – Mark

+0

Ich meine, Sie können eine neue Funktion in einer neuen benutzerdefinierten Klasse erstellen, anstatt den Quellcode zu bearbeiten. Die Logik hinter "waitForCondition" ist ziemlich klar und einfach zu implementieren. Sie müssen es nicht erneut kompilieren. –

Antwort

5

Auch wenn die Klasse Waiter oder Sleeper öffentlich war, konnten Sie die Werte nicht ändern. Der Grund dafür ist, dass das Feld waiter in der Klasse Solo endgültig ist und der Konstruktor, dem der Wert zugewiesen wird, privat ist.

Der einzige Weg, dies zu hacken, ist mit der Reflexion. Ich habe die Lösung unten versucht und es funktioniert. Beachten Sie das Paket beider Klassen!

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

Und

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

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

Super Lösung! Vielen Dank! – Mark