@ file : Suppress (" NOTH ING _ TO _ INLINE ", Ġ" unused ") Ċ package Ġb rig it te . shield Ċ Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Info Ċ import Ġandroid . app . Application Ċ import Ġandroidx . annotation . Color Res Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . databinding . Observable Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġb rig it te .* Ċ import Ġb rig it te . view model . Command Event ViewModel Ċ import Ġjunit . framework . TestCase .* Ċ import Ġorg . junit . Rule Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito .* Ċ import Ġorg . mockito . Mockito Annotations Ċ import Ġorg . mockito . verification . Verification Mode Ċ import Ġorg . ro bo lectric . Shadow s Ċ import Ġorg . ro bo lectric . shadow s . Shadow Application Ċ import Ġorg . ro bo lectric . shadow s . Shadow Network Info Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġ< a Ġhref =" mailto : auc d 2 9 @ han wh a . com "> Bur ke ĠCh oi </ a > Ġon Ġ 2 0 1 9 - 0 8 - 0 6 Ġ< p /> Ċ Ġ* Ċ Ġ* Ġhttps :// github . com / mockito / mockito / wiki / Mockito - features - in - K orean Ċ Ġ* Ċ Ġ* Ġb dd Ġ- Ġhttp :// en . wikipedia . org / wiki / Behavior _ D riven _ Development Ċ Ġ* Ġ Ġ* Ġgive , Ġwhen , Ġthen Ċ Ġ* Ċ Ġ* Ġìķ ł ë¥¼ Ġlib Ġìľ ¼ ë¡ľ Ġìĸ ´ ì¼ Ģ Ġë§Įëĵ¤ ê¹Į ëĤĺ ? Ċ Ġ*/ Ċ Ċ open Ġclass ĠBase JUnit ViewModel Test < T : ĠViewModel > Ġ@ Jvm Over loads Ġconstructor () Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġview model : ĠT ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprotected Ġfun Ġinit Mock () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠBase Ro bo ViewModel Test < T : ĠViewModel >: ĠBase Ro bo Test () Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġview model : ĠT Ċ } Ċ Ċ open Ġclass ĠBase Ro bo Test Ġ@ Jvm Over loads Ġconstructor () Ġ Ġ{ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġinit Mock () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġstring (@ String Res Ġres id : ĠInt ) Ġ= Ġapp . string ( res id ) ĊĠĠĠ Ġinline Ġfun Ġcolor (@ Color Res Ġres id : ĠInt ) Ġ= Ġapp . color ( res id ) ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////////////// // ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠSH ADOW ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////////////// // ĊĊĠĠĠ Ġprotected Ġval Ġapp Ġ= ĠApplication Provider . getApplicationContext < Application >() ĊĊĠĠĠ Ġ// Ġhttps :// stackoverflow . com / questions / 3 5 0 3 1 3 0 1 / android - ro bo lectric - unit - test - for - mar shm allow - permission helper ĊĠĠĠ Ġprotected Ġvar Ġshadow App : ĠShadow Application ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġinline Ġfun Ġmock App () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( shadow App Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow App Ġ= ĠShadow s . shadow Of ( app ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġinline Ġfun Ġmock Permissions ( var arg Ġpermissions : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmock App () ĊĊĠĠĠĠĠĠĠ Ġshadow App ?. grant Permissions (* permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhttps :// github . com / ro bo lectric / ro bo lectric / blob / master / ro bo lectric / src / test / java / org / ro bo lectric / shadow s / Shadow Connectivity Manager Test . java ĊĠĠĠ Ġprotected Ġvar Ġshadow Network Info : ĠShadow Network Info ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġinline Ġfun Ġmock Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġapp . system Service < Connectivity Manager >() ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Network Info Ġ= ĠShadow s . shadow Of ( it . active Network Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġinline Ġfun Ġmock Enable Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġshadow Network Info ?. setConnection Status ( Network Info . State . CONNECTED ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġinline Ġ Ġfun Ġmock Disable Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġshadow Network Info ?. setConnection Status ( Network Info . State . DIS CONNECTED ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġmock Observer ( event : ĠLive Data < T >): ĠObserver < T > Ġ{ ĊĠĠĠ Ġval Ġmock Observer Ġ= Ġmock ( Observer :: class . java ) Ġas ĠObserver < T > ĊĠĠĠ Ġevent . observe Fore ver ( mock Observer ) ĊĊĠĠĠ Ġreturn Ġmock Observer Ċ } Ċ Ċ inline Ġfun Ġandroidx . databinding . Observable Boolean . verify PropertyChanged ( mode : ĠVerification Mode Ġ= Ġat Least Once ()) Ġ{ ĊĠĠĠ Ġval Ġmock Ġ= Ġmock ( android x . databinding . Observable . On PropertyChanged Callback :: class . java ) ĊĠĠĠ Ġthis . add On PropertyChanged Callback ( mock ) ĊĠĠĠ Ġverify ( mock , Ġmode ). on PropertyChanged ( any ( android x . databinding . Observable :: class . java ), Ġany Int ()) Ċ } Ċ Ċ inline Ġfun Ġ< VM : ĠCommand Event ViewModel > ĠObserver < Pair < String , ĠAny >> . verify Command Changed ( view model : ĠVM , Ġvar arg Ġcmds : ĠPair < String , ĠAny >) Ġ{ ĊĠĠĠ Ġcmds . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġview model . command ( it . first , Ġit . second ) ĊĠĠĠĠĠĠĠ Ġverify Changed ( it ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< VM : ĠCommand Event ViewModel > ĠObserver < Pair < String , ĠAny >> . verify Command Changed ( view model : ĠVM , Ġvar arg Ġcmds : ĠString ) Ġ{ ĊĠĠĠ Ġcmds . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġview model . command ( it ) ĊĠĠĠĠĠĠĠ Ġverify Changed ( it Ġto Ġ- 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠObserver < T >. verify Changed ( var arg Ġcmd : ĠT , Ġmode : ĠVerification Mode Ġ= Ġat Least Once ()) Ġ{ ĊĠĠĠ Ġ// Ġat Least Once () ëĬĶ Ġê¸°ë³¸ ìłģìľ¼ë¡ľ Ġë©Ķ ìĨĮ ëĵľ Ġíĺ¸ì¶ľ ìĿ´ Ġíķľ Ġë²Ī ĠëĲĺ ëĬĶ Ġê²ĥ ìĿĦ Ġê²Ģ ì¦ Ŀ íķł ĠìĪĺ ĠìŀĪëĭ¤ . ĊĠĠĠ Ġcmd . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġverify ( this , Ġmode ). on Changed ( it ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun ĠObserver < Pair < String , ĠAny >> . verify Changed ( var arg Ġcmd : ĠString , Ġmode : ĠVerification Mode Ġ= Ġat Least Once ()) Ġ{ ĊĠĠĠ Ġcmd . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġverify ( this , Ġmode ). on Changed ( it Ġto Ġ- 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠObserver < T >. verify Never Changed ( var arg Ġcmd : ĠT ) Ġ{ ĊĠĠĠ Ġverify Changed (* cmd , Ġmode Ġ= Ġnever ()) Ċ } Ċ Ċ inline Ġfun ĠObserver < Pair < String , ĠAny >> . verify Never Changed ( var arg Ġcmd : ĠString ) Ġ{ ĊĠĠĠ Ġverify Changed (* cmd , Ġmode Ġ= Ġnever ()) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠT . mock Return ( value : ĠT ) Ġ{ ĊĠĠĠ Ġ` when `( this ). thenReturn ( value ) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠT . mock Throw ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġ` when `( this ). then Throw ( e ) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠList < T >. mock Return ( value : ĠList < T >) Ġ{ ĊĠĠĠ Ġ` when `( this ). thenReturn ( value ) Ċ } Ċ Ċ //////////////////////////////////////////////////////////////////////////////// //// Ċ // Ċ // ĠObservable . On PropertyChanged Callback Ċ // Ċ //////////////////////////////////////////////////////////////////////////////// //// Ċ Ċ inline Ġfun Ġandroidx . databinding . Observable . mock Callback (): ĠObservable . On PropertyChanged Callback Ġ{ ĊĠĠĠ Ġval Ġmock Callback Ġ= Ġmock ( android x . databinding . Observable . On PropertyChanged Callback :: class . java ) ĊĠĠĠ Ġadd On PropertyChanged Callback ( mock Callback ) ĊĊĠĠĠ Ġreturn Ġmock Callback Ċ } Ċ Ċ inline Ġfun Ġandroidx . databinding . Observable . On PropertyChanged Callback . verify PropertyChanged ( mode : ĠVerification Mode Ġ= Ġat Least Once ()) Ġ{ ĊĠĠĠ Ġverify ( this , Ġmode ). on PropertyChanged ( any ( Observable :: class . java ), Ġany Int ()) Ċ } Ċ