i trying unit test 1 of sub-flows using munit, need mock out custom java component unable so.
my sub-flow reads below
<sub-flow name="processcsvflow" tracking:enable-default-events="true"> <transformer ref="enrichwithheaderandendoffiletransformer" doc:name="headerandeofenricher" /> <set-variable variablename="outputfilename" value="#['mercury'+server.datetime.year+server.datetime.month+server.datetime.dayofmonth+server.datetime.hours +server.datetime.minutes+server.datetime.seconds+'.csv']" doc:name="outputfilename"/> <sftp:outbound-endpoint exchange-pattern="one-way" connector-ref="destinationsftp" host="${destination.host}" port="22" responsetimeout="10000" doc:name="destinationsftp" outputpattern="#[outputfilename]" path="${destination.path}" user="${destination.username}" password="${destination.password}"/> <!-- <component class="nz.co.mightyriver.creditreport.component.archiveoutputcomponent" doc:name="archive"/> --> <gzip-compress-transformer/> <sftp:outbound-endpoint exchange-pattern="one-way" connector-ref="inputsftp" host="${source.host}" port="22" responsetimeout="10000" doc:name="sourcearchivesftp" outputpattern="#[outputfilename].gzip" path="archive" user="${source.username}" password="${source.password}"/> <component doc:name="delete read file"> <singleton-object class="nz.co.mightyriver.creditreport.component.deleteprocessedfilecomponent"> <property key="host" value="${source.host}"/> <property key="username" value="${source.username}"/> <property key="password" value="${source.password}"/> <property key="workingdirectory" value="${source.path}"/> </singleton-object> </component> <parse-template location="successmessagetemplate.txt" doc:name="success template"/> <smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" user="${smtp.from.address}" password="${smtp.from.password}" to="${smtp.to.address}" from="${smtp.from.address}" subject="${mail.success.subject}" responsetimeout="10000" doc:name="successemail" connector-ref="gmail"/> <logger message="process completed successfully" level="info" doc:name="logger"/> </sub-flow>
this failing unit test
@test public void givenavalidpayload_whenflowisinvoked_itshouldsendpayloadtodestinationsftponlyonce() throws exception { destinationsftp.thenreturnsameevent(); sourcearchivesftp.thenreturnsameevent(); deleteprocessedfilecomponent.thenreturnsameevent(); successemail.thenreturnsameevent(); muleevent testevent = propertyenricher.enrich(testevent(ioutils.toinputstream("hello,dummy,payload"))).get(); runflow(process_csv_flow, testevent); verifycallofmessageprocessor("outbound-endpoint") .ofnamespace("sftp") .withattributes(attribute("name").ofnamespace("doc").withvalue("destinationsftp")) .times(1); }
my attempt @ mocking out component
deleteprocessedfilecomponent = whenmessageprocessor("component") .withattributes(attribute("name").ofnamespace("doc").withvalue("delete read file"));
i have tried few variations , none have worked, guessing component not messageprocessor
the exception follows
org.mule.api.lifecycle.initialisationexception: component has not been initialized properly, no flow constuct. @ org.mule.component.abstractcomponent.initialise(abstractcomponent.java:218) @ org.mule.processor.chain.abstractmessageprocessorchain.initialise(abstractmessageprocessorchain.java:80) @ org.mule.processor.chain.abstractmessageprocessorchain$$fastclassbycglib$$38c17d88.invoke(<generated>) @ net.sf.cglib.proxy.methodproxy.invoke(methodproxy.java:191) @ org.mule.munit.common.mp.wrappermunitmessageprocessorinterceptor.invokesuper(wrappermunitmessageprocessorinterceptor.java:71) @ org.mule.munit.common.mp.wrappermunitmessageprocessorinterceptor.invokesuper(wrappermunitmessageprocessorinterceptor.java:63) @ org.mule.munit.common.mp.wrappermunitmessageprocessorinterceptor.intercept(wrappermunitmessageprocessorinterceptor.java:49) @ org.mule.processor.chain.subflowinterceptingchainlifecyclewrapper$$enhancerbymunit$$c8ca2508.initialise(<generated>) @ org.mule.munit.runner.functional.functionalmunitsuite.initialisesubflow(functionalmunitsuite.java:269) @ org.mule.munit.runner.functional.functionalmunitsuite.runflow(functionalmunitsuite.java:259) @ nz.co.mightyriver.processcsvtest.givenavalidpayload_whenflowisinvoked_itshouldsendpayloadtodestinationsftponlyonce(processcsvtest.java:62) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:606) @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:44) @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:15) @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:41) @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:20) @ org.junit.internal.runners.statements.runbefores.evaluate(runbefores.java:28) @ org.junit.internal.runners.statements.runafters.evaluate(runafters.java:31) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:263) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:69) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:48) @ org.junit.runners.parentrunner$3.run(parentrunner.java:231) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:60) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:229) @ org.junit.runners.parentrunner.access$000(parentrunner.java:50) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:222) @ org.junit.internal.runners.statements.runafters.evaluate(runafters.java:31) @ org.junit.runners.parentrunner.run(parentrunner.java:292) @ org.eclipse.jdt.internal.junit4.runner.junit4testreference.run(junit4testreference.java:50) @ org.eclipse.jdt.internal.junit.runner.testexecution.run(testexecution.java:38) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:459) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:675) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.run(remotetestrunner.java:382) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.main(remotetestrunner.java:192)
so there no problem mock work perfectly. problem mule , little bit munit.
short answer, there no fix right now. there workaround though!
create new xml (as keep separate production code) add flow (not sub-flow) new xml. in flow added flow-ref sub-flow. test, instead of doing runflow(process_csv_flow), runflow("the_flow_you_created").
the longer answer is:
the sub-flows not real flows, don't share parent class. behave little bit different. munit stuff make fact transparent user.
as turns out not making enough, i'll create jira in munit project tackle issue. should able keep testing.