package Ġme . w ver de se . example . my reading list . data Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . eq Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġme . w ver de se . example . my reading list . data . api . Remote Book Ċ import Ġme . w ver de se . example . my reading list . data . api . Remote Books Ċ import Ġme . w ver de se . example . my reading list . data . api . Remote Books Api Ċ import Ġme . w ver de se . example . my reading list . data . model . Book Ċ import Ġme . w ver de se . example . my reading list . data . model . Book Mapper Ċ import Ġme . w ver de se . example . my reading list . data . storage . Local Book Ċ import Ġme . w ver de se . example . my reading list . data . storage . Local Book Dao Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Inject Mocks Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . junit . Mockito JUnit Runner ĊĊ Ċ @ RunWith ( Mockito JUnit Runner :: class ) Ċ class ĠBooks Service Should Ġ{ ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremote Books Api : ĠRemote Books Api ĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocal Book Dao : ĠLocal Book Dao ĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbook Mapper : ĠBook Mapper ĊĊĠĠĠ Ġ@ Inject Mocks ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbooks Service : ĠBooks Service ĊĊĠĠĠ Ġprivate Ġval Ġremote Books : ĠRemote Books Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġremote Book : ĠRemote Book Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġlocal Book : ĠLocal Book Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġbook : ĠBook Ġ= Ġmock () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( remote Books Api . fetch Remote Books ()). thenReturn ( remote Books ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( remote Books . books ). thenReturn ( listOf ( remote Book )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local Book Dao . getAll ()). thenReturn ( listOf ( local Book )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( book Mapper . remote ToLocal ( remote Book )). thenReturn ( local Book ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( book Mapper . local To Model ( local Book )). thenReturn ( book ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fetch Ġbooks Ġfrom Ġremote Ġapi `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote Books Api ). fetch Remote Books () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` map Ġremote Ġbooks Ġto Ġlocal `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( book Mapper ). remote ToLocal ( eq ( remote Book )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` store Ġlocal Ġbooks Ġin Ġdb `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local Book Dao ). insert All ( eq ( listOf ( local Book ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fetch Ġlocal Ġbooks Ġfrom Ġdb `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local Book Dao ). getAll () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` return Ġlist Ġof Ġbooks `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbooks Ġ= Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( books Ġ== ĠlistOf ( book )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠRuntimeException :: class ) ĊĠĠĠ Ġfun Ġ` sw allow Ġexception Ġwhen Ġfetching Ġfrom Ġremote `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( books Service . fetch Books ()). then Throw ( RuntimeException ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local Book Dao ). getAll () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġ` propagate Ġexception Ġwhen Ġdb Ġis Ġempty `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local Book Dao . getAll ()). thenReturn ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Service . fetch Books () ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĊĊ