我使用在Junit测试用例中运行的嵌入式服务器。有时这些服务器需要一个工作目录(例如Apache Directory服务器)。如何处理@ Rule在彼此依赖时的排序
Junit 4.7中新的@Rule可以处理这些情况。 TemporaryFolder-Rule可以创建一个临时目录。可以为服务器创建自定义ExternalResource-Rule。但我怎么处理,如果我想从一个规则结果传递到另一个:
import static org.junit.Assert.assertEquals;
import java.io.*;
import org.junit.*;
import org.junit.rules.*;
public class FolderRuleOrderingTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Rule
public MyNumberServer server = new MyNumberServer(folder);
@Test
public void testMyNumberServer() throws IOException {
server.storeNumber(10);
assertEquals(10, server.getNumber());
}
/** Simple server that can store one number */
private static class MyNumberServer extends ExternalResource {
private TemporaryFolder folder;
/** The actual datafile where the number are stored */
private File dataFile;
public MyNumberServer(TemporaryFolder folder) {
this.folder = folder;
}
@Override
protected void before() throws Throwable {
if (folder.getRoot() == null) {
throw new RuntimeException("TemporaryFolder not properly initialized");
}
//All server data are stored to a working folder
File workingFolder = folder.newFolder("my-work-folder");
dataFile = new File(workingFolder, "datafile");
}
public void storeNumber(int number) throws IOException {
dataFile.createNewFile();
DataOutputStream out = new DataOutputStream(new FileOutputStream(dataFile));
out.writeInt(number);
}
public int getNumber() throws IOException {
DataInputStream in = new DataInputStream(new FileInputStream(dataFile));
return in.readInt();
}
}
}
在这段代码的文件夹作为参数发送到服务器,使服务器可以创建一个工作目录来存储数据。然而,这不起作用,因为Junit按照在文件中定义的顺序处理相反的规则。临时文件夹规则不会在服务器规则之前执行。因此,TempraryFolder中的根文件夹将为空,从而导致相对于当前工作目录创建任何文件。
如果我颠倒了我的类中的属性顺序,我得到一个编译错误,因为我无法在定义它之前引用一个变量。
我使用JUnit 4.8.1(因为规则的顺序是固定从4.7版本有点)
排序从4.7到4.8是如何确定的? – zedoo 2014-04-24 08:23:27