junit - java.lang.IllegalStateException: the temporary folder has not yet been created -


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:

  1. 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.
  2. have @rule extend temporaryfolder rather externalresource, making sure call super() in of methods you're overriding. lets "everything temporaryfolder , 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.
  3. 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