package Ġcom . example . rick and mort y app . detail Ċ Ċ import Ġcom . example . rick and mort y app . model . entity . Character Ċ import Ġcom . example . rick and mort y app . model . repository . Character Repository Ċ import Ġcom . example . rick and mort y app . ui . detail . Character Detail ViewModel Ċ import Ġcom . example . rick and mort y app . util . Base UnitTest Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ 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 . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mockito Ċ import Ġpet ros . ef th ym iou . groovy . utils . capture Values Ċ import Ġpet ros . ef th ym iou . groovy . utils . getValue For Test Ċ import Ġjava . lang . RuntimeException Ċ Ċ @ Experimental Cor outines Api Ċ class ĠDetail ViewModel Test Ġ: ĠBase UnitTest () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠCharacter Repository Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġcharacter Ġ= Ġmock < Character >() ĊĠĠĠ Ġprivate Ġval Ġexpected Ġ= ĠResult . success ( character ) ĊĠĠĠ Ġprivate Ġval Ġexception Ġ= ĠRuntimeException (" Something Ġwent Ġwrong !") ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` em its Ġcharacter Ġdetail Ġsuccess ` (): ĠUnit Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġmock Successful Case () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠviewModel . character Detail . getValue For Test () ĊĊĠĠĠĠĠĠĠ Ġverify ( repository , Ġtimes ( 1 )). get Character ById (- 1 ) ĊĠĠĠĠĠĠĠ Ġassert ( expected Ġ== Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` em its Ġcharacter Ġdetail Ġfailed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġmock Failure Case () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠviewModel . character Detail . getValue For Test () !!. exception OrNull () ĊĠĠĠĠĠĠĠ Ġassert ( exception Ġ== Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` show Ġspinner Ġwhile Ġloading ` (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġmock Successful Case () ĊĠĠĠĠĠĠĠ ĠviewModel . loader . capture Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . character Detail . getValue For Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( true Ġ== Ġvalues [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` close Ġloader Ġafter Ġcharacter Ġload ` (): ĠUnit Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġmock Successful Case () ĊĠĠĠĠĠĠĠ ĠviewModel . loader . capture Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . character Detail . getValue For Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false Ġ== Ġvalues . last ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` close Ġloader Ġafter Ġerror ` (): ĠUnit Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġmock Failure Case () ĊĠĠĠĠĠĠĠ ĠviewModel . loader . capture Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . character Detail . getValue For Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false Ġ== Ġvalues . last ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġmock Successful Case (): ĠCharacter Detail ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( repository . get Character ById ( Mockito . any Int ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( expected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCharacter Detail ViewModel ( repository ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmock Failure Case (): ĠCharacter Detail ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( repository . get Character ById ( Mockito . any Int ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Result . failure < Character >( exception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCharacter Detail ViewModel ( repository ) ĊĠĠĠ Ġ} Ċ Ċ }