2016-03-10 11 views
6

waitForCondition() nella classe Solo in Robotium utilizza un oggetto Sleeper per interrompere un thread tra il controllo di una condizione. La classe Sleeper ha un PAUSE definito come 500 millisecondi. Voglio abbassarlo, idealmente senza scaricare il codice sorgente di Robotium, cambiandolo e ricompilando Robotium.Robotium - personalizza la durata di PAUSE nella classe Sleeper

Ho provato ad estendere la classe Solo e a costruire la mia classe di cameriere che userebbe un oggetto Sleeper personalizzato con intervalli di sospensione inferiori, ma il cameriere ha accesso a livello di pacchetto, quindi questa rotta non è disponibile.

La parola chiave finale a parte, this commit message sembra indicare che le configurazioni personalizzate dovrebbero essere (o stanno arrivando) ma non vedo alcun modo per personalizzare tali costanti nello Solo.Config class.

Qualcuno ha qualche soluzione? Grazie!

Aggiornamento: @ vLa risposta di Rallev consente di eseguire il lavoro con la riflessione. Ho creato uno pull request che è stato fuso in Robotium oggi. Nella prossima versione, sarete in grado di configurare i tempi di sonno con la classe Config.

+0

se desideri solo sovrascrivere il tempo di sonno di "WAITFORCONDITION" invece di tutti attendere functoin, perché non creare solo la propria funzione di attesa? –

+0

Perché poi farei effettivamente quello che ho detto che non volevo fare: prendere il codice sorgente di Robotium, cambiarlo e ricompilarlo. – Mark

+0

Voglio dire che puoi creare una nuova funzione in una nuova classe personalizzata invece di modificare il codice sorgente. La logica dietro "waitForCondition" è abbastanza chiara e facile da implementare. Non ti richiederà di ricompilarlo. –

risposta

5

Anche se la classe Waiter o Sleeper era pubblica, non è possibile modificare i valori. Il motivo è che il campo waiter nella classe Solo è definitivo e il costruttore a cui è assegnato il valore è privato.

L'unico modo per modificare questo è con la riflessione. Ho provato la soluzione qui sotto e funziona. Notare il pacchetto di entrambe le classi!

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

E

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

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

Impressionante soluzione! Grazie mille! – Mark