Debugging 하는 방법

RxJava 사용시 디버깅 라이버러리는

frodo 를 사용하면 좋긴 한데 ( RxJava 1지원..ㅠ)

https://github.com/android10/frodo.git

일반적인 테스트 방법을 소개한다.

.doOnNext()를 활용하면 된다.

예를 들어 다음과 같은 내용이 있다고 가정하자.

주어진 3개의 내용에 알파벳을 뽑아내는 경우이다.

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

Observable<String> items =
        Observable.just("521934/2342/Foxtrot",
                "Bravo/12112/78886/Tango",
                "283242/4542/Whiskey/2348562");

items.concatMap( s -> Observable.fromArray( s.split("/")))
     .filter(s -> s.matches("[A-Z]+"))
     .subscribe(testObserver);

System.out.println(testObserver.values());

testObserver.assertValues( "Foxtrot","Bravo","Tango","Whiskey" );

결과는 실패이고 내용은 다음과 같다.

Value count differs; Expected: 4 [Foxtrot, Bravo, Tango, Whiskey], Actual: 0 [] (latch = 0, values = 0, errors = 0, completions = 1)

예상 결과는 4개이지만 실제 0개이다.

그럼 디버깅을 시작해보자

우선 concatMap으로 제대로 보내는 지 확인해보자

.doOnNext( s-> System.out.println("Source pushed : " + s) )
.concatMap( s -> Observable.fromArray( s.split("/")))

doOnNext를 입력시

Source pushed : 521934/2342/Foxtrot
Source pushed : Bravo/12112/78886/Tango
Source pushed : 283242/4542/Whiskey/2348562

값이 제대로 전달되는 것으로 보인다..

그럼 다음껄 확인해보자

.concatMap( s -> Observable.fromArray( s.split("/")))
.doOnNext( s-> System.out.println("Source pushed : " + s) )

Result ================================================================

Source pushed : 521934
Source pushed : 2342
Source pushed : Foxtrot
Source pushed : Bravo
Source pushed : 12112
Source pushed : 78886
Source pushed : Tango
Source pushed : 283242
Source pushed : 4542
Source pushed : Whiskey
Source pushed : 2348562

정상적으로 나오는것 같다..그럼 다음껄..

.filter(s -> s.matches("[A-Z]+"))
.doOnNext( s-> System.out.println("Source pushed : " + s) )

Result ================================================================

값이 비어있다...여기가 문제인가보다. 그럼 수정 후 다시 해보자

.filter(s -> s.matches("[A-Za-z]+"))
.doOnNext( s-> System.out.println("Source pushed : " + s) )

Result ================================================================

Source pushed : Foxtrot
Source pushed : Bravo
Source pushed : Tango
Source pushed : Whiskey

이제 작동이 잘 된다..

최종 소스는 다음과 같다.

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

Observable<String> items =
        Observable.just("521934/2342/Foxtrot",
                "Bravo/12112/78886/Tango",
                "283242/4542/Whiskey/2348562");

items
     .concatMap( s -> Observable.fromArray( s.split("/")))
     .filter(s -> s.matches("[A-Za-z]+"))
     .subscribe(testObserver);

testObserver.assertValues( "Foxtrot","Bravo","Tango","Whiskey" );

doOnNext 말고도 doOnError() , doOnComplete() , doOnSubscribe() 등이 있으니 활용하면 빠른 디버깅이 가능하다.

이상으로 디버깅을 마친다.

+ Recent posts