Junit テスト ケース内で実行される組み込みサーバーを使用しています。これらのサーバーには、作業ディレクトリが必要な場合があります (Apache ディレクトリ サーバーなど)。
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 はファイルで定義されているルールとは逆の順序でルールを処理するため、これは機能しません。TemporaryFolder ルールは、サーバー ルールの前には実行されません。したがって、TempraryFolder のルート フォルダーは null になり、その結果、現在の作業ディレクトリを基準にしてファイルが作成されます。
クラスの属性の順序を逆にすると、変数を定義する前に参照できないため、コンパイル エラーが発生します。
Junit 4.8.1 を使用しています (ルールの順序が 4.7 リリースから少し修正されたため)