Slide 1

Slide 1 text

如何對使⽤用 RxJava 的 程式做 Unit Test Elvis Lin
 2017-12-27@Android Taipei

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

如何測試 Asynchronous Behavior 其實我想說的是

Slide 4

Slide 4 text

(Synchronous) Long Job Model WebClient Server 準備讀資料 資料回傳 被卡住

Slide 5

Slide 5 text

(Asynchronous) Long Job Model WebClient Server 準備讀資料 資料回傳 繼續執⾏行行 其他⼯工作

Slide 6

Slide 6 text

同步的單元測試 • doSyncCall(); • readResult(); • assertResult();

Slide 7

Slide 7 text

非同步的單元測試? • doAsyncCall(); • sleep(aWhile); • readResult(); • assertResult();

Slide 8

Slide 8 text

非同步的單元測試 — 基本技巧 • Callback • doAsyncCall(callback); • Pooling

Slide 9

Slide 9 text

非同步的單元測試 — Pooling doAsyncCall(); startTime = Time.now(); while (!responseReceived) { if (Time.now() - startTime > waitLimit) throw new TestTimeoutException(); sleep (pollingInterval); } readResult(); assertResult();

Slide 10

Slide 10 text

在 RxJava 實作 Unit Test • 拆解 Observable 跟 Observer • 使⽤用 TestObserver 與 TestScheduler • 使⽤用 Interface 隔離實作

Slide 11

Slide 11 text

拆解 Observer 跟 Observable

Slide 12

Slide 12 text

使⽤用 TestObserver / TestSubscriber • 範例例:https:// gist.github.com/ elvismetaphor/ 2188fd635d8e3308308bd05c59cf 63fa

Slide 13

Slide 13 text

使⽤用 Interface 隔離實作

Slide 14

Slide 14 text

重要的事情說三兩兩遍 • 拆解 Observable 跟 Observer • 使⽤用 TestObserver 與 TestScheduler • 使⽤用 Interface 隔離實作

Slide 15

Slide 15 text

參參考資料 • Asynchronous Behavior
 http://teddy-chen-tw.blogspot.tw/ 2012/12/3asynchronous-behavior.html • Testing RxJava2
 https://www.infoq.com/articles/Testing- RxJava2 • Testing asynchronous RxJava code using Mockito
 https://medium.com/@fabioCollini/testing- asynchronous-rxjava-code-using- mockito-8ad831a16877