package Ġcom . bur han . andro co da . ui . home Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġcom . bur han . andro co da . Main Coroutine Rule Ċ import Ġcom . bur han . andro co da . get Or Await Value Test Ċ import Ġcom . bur han . common . data . remote . dummy . Dummy Data Ċ import Ġcom . bur han . common . data . repository . I Repository Ċ import Ġcom . bur han . common . data . repository . Result Ċ import Ġcom . bur han . common . domain . use case . Download Bitcoin Price UseCase Ċ import Ġcom . bur han . common . domain . use case . Save Bit Coin Price UseCase Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Rule Ċ import Ġorg . mockito . Mockito Ċ import Ġjava . lang . Exception Ċ Ċ @ Experimental Cor outines Api Ċ class ĠHome ViewModel Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġmain Coroutine Rule Ġ= ĠMain Coroutine Rule () ĊĊĠĠĠ Ġ// ĠClass Ġunder Ġtest ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠHome ViewModel ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠI Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdownload Bitcoin Price UseCase : ĠDownload Bitcoin Price UseCase ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsave Bit Coin Price UseCase : ĠSave Bit Coin Price UseCase ĊĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠMockito . mock ( I Repository :: class . java ) ĊĠĠĠĠĠĠĠ Ġsave Bit Coin Price UseCase Ġ= ĠSave Bit Coin Price UseCase ( repository ) ĊĠĠĠĠĠĠĠ Ġdownload Bitcoin Price UseCase Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Bitcoin Price UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Bit Coin Price UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnd ro Cod a App . instance . app Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠHome ViewModel ( download Bitcoin Price UseCase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` viewModel 's Ġbit Coin Price Ġlive Data Ġmust Ġbe Ġa Ġprice Ġstring Ġwhen Ġload Data Ġis Ġcalled Ġ` () Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven : Ġthat Ġwe Ġhave Ġa Ġrepository Ġthat Ġreturns Ġsuccessful Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito .` when `( repository . download Bit Coin Price ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Result . Success ( Dummy Data . dummy Bit Coin Price ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito .` when `( repository . save Bit Coin Price ( any ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Unit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen : Ġload Data () Ġis Ġtriggered ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Data () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen : Ġbe Ġsure Ġthat Ġbit Coin Price Ġlive Data Ġis Ġa Ġvalid Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠviewModel . bit Coin Price . get Or Await Value Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" 3 8 , 4 7 1 . 0 7 8 3 ĠUSD Ġ- Ġ 3 1 , 7 0 2 . 7 0 7 6 ĠEUR Ġ- Ġ 2 8 , 1 5 8 . 1 3 6 4 ĠG BP " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` viewModel 's Ġbit Coin Price Ġlive Data Ġmust Ġbe Ġan Ġexception Ġmessage Ġwhen Ġuse Case Ġreturns Ġan Ġerror `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven : Ġthat Ġwe Ġhave Ġa Ġrepository Ġthat Ġreturns Ġan Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException (" This Ġis Ġthe Ġexception Ġmessage .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito .` when `( repository . download Bit Coin Price ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Result . Error ( exception )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen : Ġload Data () Ġis Ġtriggered ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Data () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠviewModel . bit Coin Price . get Or Await Value Test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġexception . message ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ }