今回使用したサンプルの全文をリスト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);
    }
}