今回使用したサンプルの全文をリスト2、リスト3に掲載する。このサンプルはコピーしてファイルに保存するだけで実行できるはずなので、ぜひお試しいただきたい。
リスト2 FilePathBehavior.story
import FilePath
scenario "「/」から始まる完全なファイルパスを解析する", {
given "完全なファイルパスを表す文字列(「/a/b/c.txt」)", {
path = "/a/b/c.txt"
}
when "完全なファイルパスを渡し、FilePathのインスタンスを生成する", {
filePath = new FilePath("/a/b/c.txt")
}
then "ディレクトリのパスは「/a/b/」になるはず", {
filePath.dirPath.shouldBe "/a/b/"
}
and "ファイル名は「c.txt」になるはず", {
filePath.fileName.shouldBe "c.txt"
}
}
scenario "「/」で始まらない、相対パスを解析する", {
given "「/」で始まらないファイルパス(「b/c.txt」)から生成したFilePathのインスタンス", {
filePath = new FilePath("b/c.txt")
}
then "ディレクトリのパスは「b/」になるはず", {
filePath.dirPath.shouldBe "b/"
}
and "ファイル名は「c.txt」になるはず", {
filePath.fileName.shouldBe "c.txt"
}
}
scenario "「/」で終わるディレクトリパスを解析する", {
given "「/」で終わるディレクトリパス(「/a/b/」)から生成したFilePathのインスタンス", {
filePath = new FilePath("/a/b/")
}
then "ディレクトリのパスは「/a/b/」になるはず", {
filePath.dirPath.shouldBe "/a/b/"
}
and "ファイル名は空文字になるはず", {
filePath.fileName.shouldBe ""
}
}
scenario "ファイルパスとしてnullを渡すと、例外が発生する", {
given "nullをファイルパスとして渡す", {
passnull = {
filePath = new FilePath(null)
}
}
then "IllegalArgumentExceptionが発生する", {
ensureThrows(IllegalArgumentException.class) {
pathnull()
}
}
}
リスト3 FilePath.java
public class FilePath {
private String path;
private int lastSlash;
public FilePath(String path) {
if (path == null) {
throw new IllegalArgumentException("path is null");
}
this.path = path;
this.lastSlash = path.lastIndexOf('/') + 1;
}
public String getDirPath() {
return path.substring(0, lastSlash);
}
public String getFileName() {
return path.substring(lastSlash);
}
}