今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

テスト

とあるクラスに setDirectory(File dir) というメソッドがある。以下のコードはこのメソッド用のテストだ。ターゲットのクラスは dir にディレクトリ以外が渡された場合は例外を発生するようにしている。
ほんの数日前に entity が validate すべきでないと書いたばかりなのだが(^^;

    public void testDirectory(){
        File f = new File("C:\\");
        File files[] = f.listFiles();
        for(int i = 0; i < files.length; i++){
            Exception ex = null;
            try{
                target.setDirectory(files[i]);
            }catch(Exception e){
                ex = e;
            }
            if(files[i].isDirectory() && !files[i].isHidden()){
                assertNull(ex);
                assertEquals(files[i], action.getOutputDirectory());
            }else{
                assertNotNull(ex);
            }
        }
    }

このテストを WindowsNT4.0 で動作させると、テストに失敗した。調べてみると、target に C:\pagefile.sys を渡したときに失敗していた。
try/catch ブロックの後に以下のコードを追加してテストしてみると、

            System.out.println(files[i] + " " + files[i].isDirectory() + " " + ex);

その結果は、

D:\work\testcases> java junit.swingui.TestRunner TestTarget
  :
C:\pagefile.sys false null

他のファイルを渡したときは例外を発生しているのに、なぜだー!
とりあえず、ターゲットのコードを確認してみた。

    public void setDirectory(File dir){
        if(dir.isFile()){
            throw new IllegalArgumentException("not directory.");
        }
        this.dir = dir;
    }

へぇー。C:\pagefile.sys って、ファイルじゃないのね。というわけで、isFile() を isDirectory() に変更してテストにパス。ついでに isHidden() も NG にしようと思ったが、隠しディレクトリを使っているユーザがいないという保証がないのでやめておく。
テストコードも少し改善。

        File f = new File("C:\\");

を、プラットフォーム無依存になるように、

        File f = new File(System.getProperty("user.home"));

にした。
CVS にコミットする前に、ターゲットのログを見てみると、
ディレクトリが存在しない場合は作成する。ディレクトリが存在しない場合にエラーにしないため、isFile() でチェックするように修正。」
とある。
やべー。あやうくバグを作りこむとこだった。(^^;
テストの方を isFile() でチェックするように修正して一件落着。