RxJava2, RxAndroid2

[RxJava2] 비동기 코드 테스트하기

알통몬_ 2018. 10. 12. 12:06
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 




지난 포스팅에서 테스트에 대해 포스팅했습니다.


이번 포스팅에서는 비동기 코드를 테스트 하는 방법에 대해 공부합니다.


아래 두 테스트가 있습니다.

wrongAsyncTest()는 비동기 테스트가 실패한 테스트고

correctAsyncTest()는 성공한 테스트입니다.

두 코드의 차이가 보이시나요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package rx.java.chapter08.test;
 
import java.util.concurrent.TimeUnit;
 
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
 
import io.reactivex.Observable;
 
@RunWith(JUnitPlatform.class)
public class AsyncTest {
 
    @DisplayName("Wrong Async Test")
    @Test
    
    @Disabled
    void wrongAsyncTest() {
        Observable<Integer> src = Observable.interval(100L, TimeUnit.MILLISECONDS)
                .take(5)
                .map(Long::intValue);
        src.doOnNext(System.out::println).test().assertResult(01234);
    }
    
    
    @DisplayName("Correct Async Test")
    @Test
    void correctAsyncTest() {
        Observable<Integer> src = Observable.interval(100L, TimeUnit.MILLISECONDS)
                .take(5)
                .map(Long::intValue);
        src.doOnNext(System.out::println).test().awaitDone(1L, TimeUnit.SECONDS).assertResult(01234);
    }
}
 
cs

awaitDone(1L, TimeUnit.SECONDS) 의 유무인데요.

Thread.sleep 처럼 잠시 대기하는 역할을 합니다.

때문에 아래는 테스트가 성공합니다.


이번엔 좀 더 제대로된 테스트를 해보겠습니다.

https://api.github.com/users/Parksunggyun

제 깃허브 정보를 불러오는 예제를 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package rx.java.chapter08.test;
 
import java.io.IOException;
import java.util.concurrent.TimeUnit;
 
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
 
import com.google.gson.JsonParser;
 
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
 
@RunWith(JUnitPlatform.class)
public class HttpTestEx {
    
    static OkHttpClient client = new OkHttpClient();
    
    @DisplayName("Http Test")
    @Test
    void get() {
        final String url = "https://api.github.com/users/Parksunggyun";
        
        Observable<String> src = Observable.just(url)
                .subscribeOn(Schedulers.io())
                .map(HttpTestEx::get)
                .doOnNext(System.out::println)
                .map(json -> parseValue(json, "name"))
                .observeOn(Schedulers.newThread());
        
        String expect = "Thomas Park";
        src.doOnNext(System.out::println)
        .test()
        .awaitDone(3000L, TimeUnit.MILLISECONDS)
        .assertResult(expect);
        
    }
    
    public static String get(String url) throws IOException {
        Request request = new Request.Builder().url(url).build();
        try {
            Response res = client.newCall(request).execute();
            return res.body().string();
        } catch (IOException e) {
            System.out.println(e.getMessage());
            throw e;
        }
    }
    
    public static String parseValue(String json, String key) { 
        return new JsonParser().parse(json)
                .getAsJsonObject()
                .get(key)
                .getAsString();
    }
 
}
 
cs

awaitDone(3000L, TimeUnit.MILLISECONDS)로 3초간 대기를 합니다.

예제를 실행시켜보면 테스트가 성공하는 걸 확인할 수 있습니다.

이상입니다.

다음 포스팅에서는 RxJava2의 Flowable과 배압에 대해 공부합니다.



반응형