package Ġcom . code deco . lib . arch . repository . coroutine Ċ Ċ import Ġcom . code deco . lib . arch . repository . Cache Strategy Ċ import Ġcom . code deco . lib . arch . repository . DataSource Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito Annotations Ċ Ċ @ Experimental Cor outines Api Ċ class ĠRepository Helper Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsut Ġ= ĠRepository Helper < Test Service >() ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnetwork Service : ĠTest Service ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcache Service : ĠCache Service ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocal Service : ĠTest Service ĊĊĠĠĠ Ġprivate Ġval Ġhas DataService Ġ= ĠHas DataService () ĊĠĠĠ Ġprivate Ġval Ġexception Service Ġ= ĠException Service () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĠĠĠĠĠĠĠ Ġsut . set DataSource ( DataSource . Network , Ġnetwork Service ) ĊĠĠĠĠĠĠĠ Ġsut . set DataSource ( DataSource . Cache , Ġcache Service ) ĊĠĠĠĠĠĠĠ Ġsut . set DataSource ( DataSource . Local , Ġlocal Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetData ( cache Strategy : ĠCache Strategy ): ĠFlow < String ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsut . execute ( cache Strategy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġservice Ġ-> Ġservice . getData () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġservice , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Ġ!= Ġnull Ġ&& Ġservice Ġis ĠTest Cache able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . cache ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ network () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). cache ( RESPONSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ network _ failed () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ network _ no _ network _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ network _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstandard _ hit _ cache _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Standard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Only _ hit _ cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Only _ hit _ cache _ failed () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . has DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Only _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . has DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Only _ hit _ network () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Only _ hit _ network _ failed () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . exception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Only _ no _ network _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . has DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Only ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ hit _ network _ hit _ cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE , ĠRESP ONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). cache ( RESPONSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ hit _ network () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . has DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). cache ( RESPONSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ hit _ cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . exception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ hit _ network _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ hit _ cache _ no _ network _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcache Then Network _ no _ network _ service _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Cache Then Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of (), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Replace Cache _ hit _ network () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Replace Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( cache Service , ĠMockito . times ( 1 )). cache ( RESPONSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Replace Cache _ no _ network _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Replace Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Replace Cache _ hit _ network _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Replace Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( network Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnetwork Replace Cache _ no _ network _ service _ no _ cache _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Network ) ĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Cache ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Network Replace Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of (), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlocal _ hit _ local () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġhas DataService . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of ( RESPONSE ), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( local Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlocal _ hit _ local _ failed () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . exception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify ( local Service , ĠMockito . times ( 1 )). getData () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No More Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlocal _ no _ local _ service () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito .` when `( network Service . getData ()). then Ġ{ Ġthis . exception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( cache Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local Service . getData ()). then Ġ{ Ġexception Service . getData () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsut . remove DataSource ( DataSource . Local ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual E mission Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Response Ġ= ĠArrayList < String ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactual Exception : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetData ( Cache Strategy . Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Response . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual E mission ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġactual E mission ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertArrayEquals ( array Of < String >(), Ġactual Response . toArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( actual Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġservice Ġhit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( network Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( cache Service ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . verify No Interactions ( local Service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠRESP ONSE Ġ= Ġ" Response " Ċ Ċ private Ġinterface ĠTest Service Ġ{ ĊĠĠĠ Ġfun ĠgetData (): ĠString ? Ċ } Ċ Ċ private Ġopen Ġclass ĠHas DataService Ġ: ĠTest Service Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetData (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAssume ĠAPI Ġalways Ġsuccess ĊĠĠĠĠĠĠĠ Ġreturn ĠRESP ONSE ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġopen Ġclass ĠException Service Ġ: ĠTest Service Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetData (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Something Ġis Ġwrong ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġinterface ĠTest Cache able Ġ{ ĊĠĠĠ Ġfun Ġcache ( data : ĠString ) Ċ } Ċ Ċ private Ġopen Ġclass ĠCache Service Ġ: ĠTest Service , ĠTest Cache able Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcache Data : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠgetData (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcache ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Data Ġ= Ġdata ĊĠĠĠ Ġ} Ċ }