반응형
공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
지난 포스팅에서 테스트에 대해 포스팅했습니다.
이번 포스팅에서는 비동기 코드를 테스트 하는 방법에 대해 공부합니다.
아래 두 테스트가 있습니다.
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(0, 1, 2, 3, 4); } @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(0, 1, 2, 3, 4); } } | 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과 배압에 대해 공부합니다.
반응형
'RxJava2, RxAndroid2' 카테고리의 다른 글
RxAndroid2 중간에 멈출 수 있는 타이머만들기! Observable.interval (0) | 2019.05.20 |
---|---|
[RxJava2] Flowable 과 배압 (0) | 2018.10.12 |
[RxJava2] JUnit 5 + RxJava2 로 테스트 코드 짜기 (0) | 2018.10.12 |
[RxJava2] 흐름제어 함수 : sample(), buffer(), throttleFirst(), throttleLast(), window(), debounce() (0) | 2018.10.11 |
[RxJava2] 예외처리2 - 재시도 : retry(), retryUntil(), retryWhen() (0) | 2018.10.11 |