2016-04-15 11 views
6

Bir uygulayıcıdan veri almak için RxJava kullanan bir sunucuyu test etmeye çalışıyorum. Kurulum yönteminde ben böyle bir şey yapıyorum:Schedulers.immediate() komut satırı notu testleriyle çalışmaz

@Before 
public void setup() { 
    RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
     @Override 
     public Scheduler getMainThreadScheduler() { 
      return Schedulers.immediate(); 
     } 
    }); 
} 

Yani benim test yönteminde ben sunum çağrıyı test edebilirsiniz:

@Test 
public void testLoad() { 
    presenter.load(); 
    verify(view).dataLoaded(data); 
    verify(interactor).load(); 
} 

beklendiği gibi ben Android Studio her şey çalışma ile testini çalıştırırsanız, Sorunum komut satırında denerseniz

gradle test 

Sonra Test başarısız olduğunu çünkü: Actually, there were zero interactions with this mock.

Bu yüzden bir Thread.sleep (2000) sunucusuna yapılan çağrıdan hemen sonra çalışmayı denedim ve sonra da çalışıyor, bu yüzden Schedulers.immediate(); komut satırından çalışmıyor, ancak neden ve nasıl hata ayıklaması/düzeltmesi hakkında hiçbir fikrim yok. Herhangi bir fikrin var mı?

DÜZENLEME: sunum uygulaması ->

public void load() { 
    Observable<List<Data>> obs = interactor.load() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()); 
    obs.subscribe(new Observer<List<Data>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(List<Data> data) { 
      view.dataLoaded(data); 
     } 
    }); 
} 
+0

"getMainThreadScheduler" 'da arandığını kontrol etmek için bazı günlükler ekleyebilir misiniz? Kodlarınızda başka yarış koşullarınız olabilir. Zamanlayıcıları kodlarınızda nasıl kullandığınızı göstermek harika olurdu. – zsxwing

+0

"Yük" uygulamanız eşzamansızdır (Schedulers.io() 'da abone olun). Bu nedenle, bir kerede 'load' çağrıldıktan sonra doğrulamamalısınız. – zsxwing

+0

evet haklısınız, aslında sunucuda rxjava'nın tüm bağımlılıklarını kaldırmayı çözdüm, bu yüzden rxjava çağıran bir sarıcı var ama testte rxjava kullanmayan farklı bir sarıcı kullanıyorum. Sonunda, rxjava'yı değil, sunucumun mantığını test etmek istemiyorum :) –

cevap

0

Siz de RxJava Schedulers alay edebilir.

RxJavaHooks.reset(); 
RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate()); 

Tipik iyi bir şey kurulum & devrelerde üzerinde reset aramak için.