TestScheduler

TestObserver(or TestSubscriber)을 이용시await를 통해서 기다릴수 있지만 그러기엔 시간이 많이 걸릴수 있다.

그래서 타임머신기능으로 시간을 미리 땡겨서 테스트가 가능하다.

예를 들어 interval(10) 으로 10초뒤에 값을 체크를 하는 경우 10초를 기다리지 않고 10초 뒤로 시간 설정 후 바로 테스트 하게끔 하는 것이다.

이 부분에 대해서 좀 더 공부가 필요해보인다.

TestScheduler testScheduler = new TestScheduler();

TestObserver<Long> testObserver = new TestObserver<>();

Observable<Long> minTicker = Observable.interval(1, TimeUnit.MINUTES , testScheduler);

minTicker.subscribe(testObserver);

//30초 뒤로 이동
testScheduler.advanceTimeBy(30 , TimeUnit.SECONDS);

//앞으로 이동했기 때문에 아직 배출이 안됨
testObserver.assertValueCount(0);

//구독 후 뒤로 70초 이동..
testScheduler.advanceTimeTo(70 , TimeUnit.SECONDS);

//1분 이동했으니 1개가 나온다. 
testObserver.assertValueCount(1);

System.out.println("#1 current time = " + testScheduler.now(TimeUnit.SECONDS));

//구독후 90분 뒤로 감
testScheduler.advanceTimeTo(90, TimeUnit.MINUTES);

System.out.println("#2 current time = " + testScheduler.now(TimeUnit.SECONDS));

//결과값 : 90개가 나온다.
testObserver.assertValueCount(90);

now() 는 얼마나 시간을 앞당겼는지 체크를 할수 있다.

triggerAction() 이 무엇인지도 한번 찾아보자.

TriggerAction()

공식 설명은 이 스케줄러의 현재 시간 또는 그 이전에 아직 트리거되지 않았거나 트리거되도록 예정된 모든 작업을 트리거합니다.

Triggers any actions that have not yet been triggered and that are scheduled to be triggered at or before this Scheduler's present time

TestScheduler s = new TestScheduler();

s.createWorker().schedule(
        () -> System.out.println("Immediate"));
s.createWorker().schedule(
        () -> System.out.println("20s"),
        20, TimeUnit.SECONDS);

s.triggerActions();
System.out.println("Virtual time: " + s.now(TimeUnit.SECONDS));

결과값

Immediate
Virtual time: 0


+ Recent posts