@ file : Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") Ċ Ċ package Ġio . just dev it . spring . logging Ċ Ċ import Ġio . just dev it . spring . logging . action . Action Name Resolver Ċ import Ġio . just dev it . spring . logging . action . Action Name Resolver Provider Ċ import Ġio . just dev it . spring . logging . writer . Log Writer Ċ import Ġio . just dev it . spring . logging . writer . Log Writer Provider Ċ import Ġio . just dev it . spring . logging . writer . On Finish Log Context Ċ import Ġio . just dev it . spring . logging . writer . On Start Log Context Ċ import Ġio . just dev it . spring . logging . writer . On Throw Log Context Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Inject Mock Ks Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . mock k . junit 5 . Mock K Extension Ċ import Ġio . mock k . just Run Ċ import Ġio . mock k . slot Ċ import Ġio . mock k . verify Ċ import Ġorg . aop al liance . intercept . Method Invocation Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . slf 4 j . M DC Ċ import Ġjava . lang . reflect . Method Ċ Ċ @ Extend With ( Mock K Extension :: class ) Ċ internal Ġclass ĠDefault Log gable Method Interceptor Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprocessing ReturnValue Ġ= Ġ" PROC ES SED " ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġinvocation : ĠMethod Invocation ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġaction Name Resolver Provider : ĠAction Name Resolver Provider ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġaction Name Resolver : ĠAction Name Resolver ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġlog Writer Provider : ĠLog Writer Provider ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġlog Writer : ĠLog Writer ĊĊĠĠĠ Ġ@ Inject Mock Ks ĊĠĠĠ Ġlateinit Ġvar Ġinterceptor : ĠDefault Log gable Method Interceptor ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns Ġempty Array () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġreturns Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġaction Name Resolver Provider . find Action Name Resolver ( any ()) Ġ} Ġreturns Ġaction Name Resolver ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġaction Name Resolver . solve Action Name ( any ()) Ġ} Ġanswers Ġ{ Ġ( invocation . args [ 0 ] Ġas ĠMethod ). name Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġlog Writer Provider . find Log Writer ( any ()) Ġ} Ġreturns Ġlog Writer ĊĠĠĠĠĠĠĠ Ġjust Run Ġ{ Ġlog Writer . onStart ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġjust Run Ġ{ Ġlog Writer . on Finish ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġjust Run Ġ{ Ġlog Writer . on Throw ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġfind Ġannotation Ġon Ġmethod `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Log gable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġannotated Function () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" annotated Function ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . action ). isEqualTo (" annotated Function ") ĊĠĠĠĠĠĠĠ Ġval Ġon Finish Slot Ġ= Ġslot < On Finish Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . on Finish ( capture ( on Finish Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( on Finish Slot . captured . action ). isEqualTo (" annotated Function ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġfind Ġannotation Ġon Ġclass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġnot Annotated Function () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" not Annotated Function ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . action ). isEqualTo (" not Annotated Function ") ĊĠĠĠĠĠĠĠ Ġval Ġon Finish Slot Ġ= Ġslot < On Finish Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . on Finish ( capture ( on Finish Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( on Finish Slot . captured . action ). isEqualTo (" not Annotated Function ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġinject Ġparameters Ġto Ġwriter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore All Parameters Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest ( p : ĠString ) Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ", ĠString :: class . java ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns ĠarrayOf (" P ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . parameters ). contains Exactly (" P ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġignore Ġall Ġparameters `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore All Parameters Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest ( p : ĠString ) Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ", ĠString :: class . java ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns ĠarrayOf (" P ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . parameters ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġinject Ġreturn Ġvalue Ġto Ġwriter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore ReturnValue Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns ĠarrayOf (" P ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval Ġon Finish Slot Ġ= Ġslot < On Finish Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . on Finish ( capture ( on Finish Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( on Finish Slot . captured . returnValue ). isEqualTo ( processing ReturnValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġignore Ġreturn Ġvalue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore ReturnValue Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns ĠarrayOf (" P ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( processing ReturnValue ) ĊĠĠĠĠĠĠĠ Ġval Ġon Finish Slot Ġ= Ġslot < On Finish Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . on Finish ( capture ( on Finish Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( on Finish Slot . captured . returnValue ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġprocess Ġthrown Ġexception `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore Throws Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns Ġempty Array () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġthrows ĠIllegalStateException () ĊĊĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ Ġinterceptor . invoke ( invocation ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . action ). isEqualTo (" test ") ĊĠĠĠĠĠĠĠ Ġval Ġon Fail Slot Ġ= Ġslot < On Throw Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . on Throw ( capture ( on Fail Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( on Fail Slot . captured . action ). isEqualTo (" test ") ĊĠĠĠĠĠĠĠ ĠassertThat ( on Fail Slot . captured . exception ). isInstanceOf ( IllegalStateException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġignore Ġthrown Ġexception `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Log gable ( ignore Throws Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . arguments Ġ} Ġreturns Ġempty Array () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġthrows ĠIllegalStateException () ĊĊĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ Ġinterceptor . invoke ( invocation ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠonStart Slot Ġ= Ġslot < On Start Log Context >() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġlog Writer . onStart ( capture ( onStart Slot )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( onStart Slot . captured . action ). isEqualTo (" test ") ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġlog Writer . on Throw ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġset ĠM DC Ġaction Ġattribute `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Log gable (" TEST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM DC . remove ( ACTION _ ATTRIBUTE _ NAME ) ĊĠĠĠĠĠĠĠ Ġvar Ġaction : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠM DC . get ( ACTION _ ATTRIBUTE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( action ). isEqualTo (" TEST ") ĊĠĠĠĠĠĠĠ ĠassertThat ( M DC . get ( ACTION _ ATTRIBUTE _ NAME )). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġreset ĠM DC Ġaction Ġattribute `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Log gable ( action Ġ= Ġ" TEST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM DC . put ( ACTION _ ATTRIBUTE _ NAME , Ġ" PREV _ ACTION ") ĊĠĠĠĠĠĠĠ Ġvar Ġaction : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠM DC . get ( ACTION _ ATTRIBUTE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( action ). isEqualTo (" TEST ") ĊĠĠĠĠĠĠĠ ĠassertThat ( M DC . get ( ACTION _ ATTRIBUTE _ NAME )). isEqualTo (" PREV _ ACTION ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġbe Ġable Ġto Ġignore Ġlogging Ġof Ġnested Ġaction `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠTest Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Log gable ( action Ġ= Ġ" TEST ", Ġnest able Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtest () Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM DC . put ( ACTION _ ATTRIBUTE _ NAME , Ġ" PREV _ ACTION ") ĊĠĠĠĠĠĠĠ Ġvar Ġaction : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . method Ġ} Ġreturns ĠTest Class :: class . java . getMethod (" test ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinvocation . proceed () Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠM DC . get ( ACTION _ ATTRIBUTE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinterceptor . invoke ( invocation ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( action ). isEqualTo (" PREV _ ACTION ") ĊĠĠĠĠĠĠĠ ĠassertThat ( M DC . get ( ACTION _ ATTRIBUTE _ NAME )). isEqualTo (" PREV _ ACTION ") ĊĠĠĠ Ġ} Ċ } Ċ