2016-03-10 14 views
6

Robotium'daki Solo sınıfında waitForCondition(), bir koşulun denetlenmesi arasında bir iş parçacığı arasında uyumak için bir Sleeper nesnesi kullanır. Sleeper sınıfı, 500 milisaniye olarak tanımlanan bir PAUSE'ye sahiptir. Bunu, ideal olarak, Robotium kaynak kodunu indirmeden, değiştirerek ve Robotium'u yeniden derlemeden indirmek istiyorum.Robotium - Sleeper sınıfındaki PAUSE süresini özelleştirme

Solo sınıfını genişletmeyi ve daha düşük uyku aralıklarıyla özel bir Sleeper nesnesini kullanacak olan kendi Garson sınıfımı oluşturmayı denedim, ancak Garson paket düzeyinde erişime sahip olduğundan bu yol kullanılamıyor.

Son anahtar sözcük bir yana, this commit message, özel yapılandırmaların (veya gelmekte olan) olması gerektiğini belirtiyor gibi görünüyor, ancak bu sabitleri Solo.Config class'da özelleştirmek için herhangi bir yol göremiyorum.

Herhangi bir çözümü olan var mı? Teşekkürler!

Güncelleme: @ vRallev'in aşağıdaki yanıtı işin yansımasıyla yapılmasını sağlar. Bugün Robotium ile birleştirilen bir pull request yaptım. Bir sonraki sürümde, Config sınıfıyla uyku zamanlarını yapılandırabilirsiniz.

+0

Yalnızca "waitForCondition" yerine tüm functoin beklemek uyku süresini üzerine yazmak istiyorsanız, neden sadece kendi bekleme işlevi oluşturmak değil mi? –

+0

Çünkü o zaman yapmak istemediğimi söylediklerimi yapıyordum: Robotium kodunu almak, değiştirmek ve yeniden derlemek. – Mark

+0

Yani kaynak kodunu düzenlemek yerine yeni bir özel sınıfta yeni bir işlev oluşturabilirsiniz. "WaitForCondition" ın arkasındaki mantık oldukça açık ve uygulanması kolaydır. Yeniden derlemenizi gerektirmez. –

cevap

5

Waiter veya Sleeper sınıfı herkese açık olsa bile, değerleri değiştiremezsiniz. Nedeni, Solo sınıfındaki waiter alanının son ve değerin atandığı yapıcının özel olmasıdır.

Bunu kesmenin tek yolu yansımadır. Çözümü aşağıda denedim ve işe yarıyor. Her iki sınıfın paketine dikkat edin!

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

Ve

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

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

Harika bir çözüm! Çok teşekkürler! – Mark