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

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

GUIが関連する部分のテスト

JUnitだけでテストできる範囲を増やすには、AWTEventDispatchThreadから呼び出されるメソッドには、ほとんど何も書かないようにするとよい。ControllerまたはModelにメッセージを投げて、それだけで終わりにする。そうすれば、ControllerやModelのテストコードで大部分をカバーできる。
例えばこんな感じ。

    public void actionPerformed(ActionEvent e) {
        Controller controller = new Controller(e);
        controller.doSomething();
    }

Controller#doSomething()の中身をGUIに依存するメソッドと依存しないメソッドに分割してしまえば、かなりの部分をテストできるようになる。
ちなみに、AWTEventDispatchThreadから呼び出されるメソッドの大半は、AWTEvent(を継承したEventObject)を引数で渡される。これをきちんとControllerに渡しておくことが重要。なぜなら、処理の途中でエラーを検出した場合にダイアログなどでエラーを通知したり、処理の継続をするかどうかをユーザに判断させる場合にダイアログを表示する必要がある。ダイアログを表示するには、どのWindowをオーナにするのかが必要になる。そのためのオーナWindowを見つけるために、AWTEvent#getSource()からたどる必要があるからだ。
オーナにnullを指定することも許されているが、どのWindowに関するダイアログなのかがわからなくなるため、ユーザビリティが激しく悪くなるからやってはいけない。