@Rule objects are not initialized before @BeforeClass methods are called. Is
this by design or a bug?
For example:
package test;
import java.io.File;
import java.io.IOException;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class TemporaryFolderRuleBeforeClass {
@Rule
public static TemporaryFolder testFolder = new TemporaryFolder();
@BeforeClass
public static void testInTempFolder() throws IOException {
File tempFile = testFolder.newFile("file.txt");
File tempFolder = testFolder.newFolder("folder");
System.out.println("Test folder: " + testFolder.getRoot());
// test
Assert.assertNotNull(testFolder.getRoot());
}
@Test
public void test() {
// noop
}
}
Having the TemporaryFolder Rule declared as static is OK as this example test
shows:
public class TestTemporaryFolderRuleStatic {
@Rule
public static TemporaryFolder testFolder = new TemporaryFolder();
@Test
public void testInTempFolder() throws IOException {
File tempFile = testFolder.newFile("file.txt");
File tempFolder = testFolder.newFolder("folder");
System.out.println("Test folder: " + testFolder.getRoot());
// test
Assert.assertNotNull(testFolder.getRoot());
}
}
How can @Rules be used from @BeforeClass?
Calling TemporaryFolder.create() would work only for TemporaryFolder and not
Rules in general but would be against the advice of create method Javadoc.