2016-11-26 2 views
0

버튼이 있다고 가정합니다.단위 테스트 다중 스레드 Android RxJava

버튼을 클릭하면 사용 불가는 (mainThread 스레드), 데이터를로드 할 수있는 백그라운드 작업 (IO 스레드)를 시작합니다. 데이터가로드되면 버튼이 다시 활성화됩니다 (mainThread 스레드). 시험에 대한

, 즉시에 스케줄러를 변경하는 것이 일반적이지만이 내 경우에는 작동하지 않습니다 - 버튼이 비활성화 인 경우 버튼 클릭이 백그라운드 작업이 완료 될 때까지 차단합니다, 나는 검사 할 수 없을거야 그것이 백그라운드 작업을 시작한 후.

단위 테스트 외에도 기능성 에스프레소 테스트에서 이것을 테스트하고 싶습니다.

이 멀티 스레드 RxJava 케이스를 테스트하려면 어떻게해야합니까?

class CustomThreadFactory implements ThreadFactory { 
    public Thread lastT; 
    public int newThreadCounter = 0; 
    @Override 
    public Thread newThread(Runnable r) { 
    newThreadCounter++; 
    System.out.println("newThread called"); 
    Thread lastT = new Thread(r); //or CustomThread(r) 
    return lastT; 
    } 
} 

당신도 갈 수 있습니다 :

답변

0

당신은 당신이 스케줄러를 사용하여 새 스레드가 필요할 때 플러스라고하기를 메인 큐를 차단할 수 없습니다 지금

ThreadFactory custom = new CustomThreadFactory(); 
ExecutorService executorService = Executors.newCachedThreadPool(custom); //or use newSingleThreadExecutor(..) 
Scheduler customScheduler = Schedulers.from(executorService); 

자신의 ThreadFactory를 쓸 수 있습니다 더 나아가 새로운 나사를 장비하십시오 -

class CustomThread extends Thread { 
    public CustomThread(Runnable r) { 
     super(r); 
    } 
    @Override 
    public void run() { 
     System.out.printf("About to run!"); 
     super.run(); 
    } 
    } 
} 
0

RxUtil

1).RxUtildefault implementation을 생성자 또는 DI를 통해 제공하십시오.

2). 대신 직접 스케줄러를 적용, 당신이 관찰 만들 때 :

.subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 

사용 RxUtil :

.compose(rxUtil.applySchedulers()) 

예 :

https://github.com/DAYTeam/GoEnglish/blob/master/app/src/main/java/ru/goenglish/goenglish/services/impl/ScheduleServiceImpl.java#L38-L44

3). 단위 테스트 대신 RxUtil의 기본 구현 조롱 버전을 생성 :

public class UnitTestRxUtil implements RxUtil { 
    @Override 
    public <T> Observable.Transformer<T, T> applySchedulers() { 
     return observable -> observable.subscribeOn(Schedulers.immediate()) 
       .observeOn(Schedulers.immediate()); 
    } 
} 

링크 : https://github.com/DAYTeam/GoEnglish/blob/master/app/src/test/java/ru/goenglish/goenglish/util/UnitTestRxUtil.java

4).이 구현을 생성자 또는 DI를 통해 전달합니다.
예 (생성자) 결과 https://github.com/DAYTeam/GoEnglish/blob/master/app/src/test/java/ru/goenglish/goenglish/ScheduleServiceImplTest.java#L45

, 모든 테스트는, 하나 개의 스레드에서 실행되며, 응용 프로그램에서는, 다른 실행기를

에 실행될
관련 문제