package Ġorg . cc ci . g to . android . common . db Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . yield Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ class ĠLive Data Registry Test Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġinstant Task Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval Ġregistry Ġ= ĠLive Data Registry () ĊĠĠĠ Ġlateinit Ġvar Ġdao : ĠLive Data Dao ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġdao Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġwhenever ( dao . live Data Registry ). thenReturn ( registry ) ĊĠĠĠĠĠĠĠ Ġwhenever ( dao . find LiveData ( Obj :: class . java )). then Call Real Method () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġverify invalidate No Concurrent Modification () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġ 2 Ġr acing Ġthreads , Ġ 1 Ġinvalid ating ĠLive Data Ġhandles , Ġand Ġ 1 Ġregistering Ġnew ĠLive Data Ġhandles ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshutdown Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! shutdown . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistry . invalidate ( Obj :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 1 0 0 0 ). map Ġ{ Ġdao . find LiveData ( Obj :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshutdown . set ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠObj Ċ