Я использую встроенные серверы, которые работают внутри тестовых случаев Junit. Иногда этим серверам требуется рабочий каталог (например, сервер каталогов Apache).
Новый @Rule в Junit 4.7 может справиться с этими случаями. 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 обрабатывает правила в обратном порядке, как они определены в файле. Правило TemporaryFolder не будет выполнено перед Правилом сервера. Таким образом, корневая папка в TempraryFolder будет нулевой, в результате чего любые файлы будут созданы относительно текущего рабочего каталога.
Если я поменяю порядок атрибутов в моем классе, я получу ошибку компиляции, потому что не могу ссылаться на переменную до ее определения.
Я использую Junit 4.8.1 (потому что порядок правил был немного исправлен в версии 4.7)