package Ġcom . cup sof code . most valu able idea Ċ Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . cup sof code . most valu able idea . domain . GetItem UseCase Ċ import Ġcom . cup sof code . most valu able idea . domain . Model Ċ import Ġcom . cup sof code . most valu able idea . domain . Throw Error UseCase Ċ import Ġcom . cup sof code . most valu able idea . ui . UI Model Ċ import Ġcom . cup sof code . most valu able idea . ui . mv vm . MV VM ViewModel Ċ import Ġio . mock k .* Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . mock k . impl . annotations . Rel ax ed Mock K Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . plugins . Rx Java Plugins Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjunit . framework . Assert . assertEquals Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Captor Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . exp ĊĊ Ċ class ĠMV VM ViewModel Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠMV VM ViewModel ĊĊĠĠĠ Ġprivate Ġval Ġis Button Enabled Observer : ĠObserver < Boolean > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmock k Ġ{ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust ĠRuns Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġitem Observer : ĠObserver < UI Model > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmock k Ġ{ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust ĠRuns Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġshow Loading Observer : ĠObserver < Boolean > Ġby Ġlazy Ġ{ ĊĊĠĠĠĠĠĠĠ Ġmock k Ġ{ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust ĠRuns Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġerror Observer : ĠObserver < String > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġmock k Ġ{ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust ĠRuns Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠMV VM ViewModel () ĊĠĠĠĠĠĠĠ ĠviewModel . item . observe Fore ver ( item Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . show Loading . observe Fore ver ( show Loading Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . button Enabled . observe Fore ver ( is Button Enabled Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . error . observe Fore ver ( error Observer ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġitem Ġwhen Ġview Ġis Ġcreated `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠ Ġmock k Object ( GetItem UseCase ) ĊĠĠĠĠĠĠĠ Ġmock k Object ( Throw Error UseCase ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠModel () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Item Ġ= ĠUI Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Price Ġ= Ġdata . price . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Name Ġ= Ġdata . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Number In Dropdown Ġ= Ġdata . max Count ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġitem Slot Ġ= Ġslot < UI Model >() ĊĠĠĠĠĠĠĠ Ġval Ġloading Slot Ġ= Ġslot < Boolean >() ĊĊĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠ ĠviewModel . on View Created () ĊĠĠĠĠĠĠĠ Ġtest Scheduler . advance Time By ( 4 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĠGet Item UseCase . execute () Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĠThrow Error UseCase . execute () Ġwas Not Ġcalled Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġitem Observer . on Changed ( capture ( item Slot )) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġshow Loading Observer . on Changed ( capture ( loading Slot )) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Item . itemName , Ġitem Slot . captured . itemName ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Item . item Price , Ġitem Slot . captured . item Price ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . item . remove Observer ( item Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . show Loading . remove Observer ( show Loading Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . button Enabled . remove Observer ( is Button Enabled Observer ) ĊĠĠĠ Ġ} Ċ }