i creating new @rule
use case looks
public class activedirectoryconfigurationrule extends externalresource { @rule public temporaryfolder temporaryfolder = new temporaryfolder(); public file addactivedirectoryconfigurationtofile(activedirectoryconfiguration configuration) throws ioexception { file file = temporaryfolder.newfile(); objectmapper.writevalue(file, configuration); return file; } private objectmapper registerjdk8moduleandgetobjectmapper() { objectmapper objectmapper = new objectmapper(); objectmapper.registermodule(new jdk8module()); return objectmapper; } }
in test
use
public class activedirectoryconfigurationstoretest { @rule public activedirectoryconfigurationrule configurationrule = new activedirectoryconfigurationrule(); @test public void getwhenconfigurationexists() throws exception { activedirectoryconfiguration activedirectoryconfiguration = //....; file configurationtofile = configurationrule.addactivedirectoryconfigurationtofile(activedirectoryconfiguration); activedirectoryconfigurationstore configurationstore = new activedirectoryconfigurationstore(configurationtofile); optional<activedirectoryconfiguration> maybeconfiguration = configurationstore.getconfiguration(); asserttrue(maybeconfiguration.ispresent()); } }
when run test, error
java.lang.illegalstateexception: temporary folder has not yet been created @ org.junit.rules.temporaryfolder.getroot(temporaryfolder.java:145) @ org.junit.rules.temporaryfolder.newfile(temporaryfolder.java:78) @ com.conf.store.activedirectoryconfigurationrule.addactivedirectoryconfigurationtofile(activedirectoryconfigurationrule.java:48) @ com.conf.store.activedirectoryconfigurationstoretest.getwhenconfigurationexists(activedirectoryconfigurationstoretest.java:25) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:498) @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:50) @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:12) @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:47) @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:17) @ org.junit.rules.externalresource$1.evaluate(externalresource.java:48) @ org.junit.rules.runrules.evaluate(runrules.java:20) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:325) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:78) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:57) @ org.junit.runners.parentrunner$3.run(parentrunner.java:290) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:71) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:288) @ org.junit.runners.parentrunner.access$000(parentrunner.java:58) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:268) @ org.junit.runners.parentrunner.run(parentrunner.java:363) @ org.junit.runner.junitcore.run(junitcore.java:137) @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:119) @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:42) @ com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart(junitstarter.java:234) @ com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:74) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:498) @ com.intellij.rt.execution.application.appmain.main(appmain.java:144)
seems when creating own @rule
, not able depend on existing @rule
is issue? , how resolve it?
yes, don't think there's built in junit let "nest" @rule objects you're doing.
i think obvious options be:
- in custom @rule, call various methods on child @rule @ appropriate times. (essentially, pretend junit library, using @rule per interface.) haven't dug details see how complex be.
- have @rule extend
temporaryfolder
ratherexternalresource
, making sure callsuper()
in of methods you're overriding. lets "everythingtemporaryfolder
, some", perhaps isn't perfect oo-theory (as it's not type-of temporaryfolder) should work way you're looking for. i've used approach when setting particular folder needed set particular environment tests, , worked well. - have custom @rule take in constructor parameter
temporaryfolder
reference, save in field , use needed. requires users of @rule include both @rule objects, perhaps makes clear test require both temporary folder work in particular custom setup.
Comments
Post a Comment