WicketTester で四苦八苦

2007–06–01

仕事でもお家でも、テストプログラムを書かないと落ちつかないようになってきた。

で、おうちで遊んでるWicketでもWicketTesterを使ってTestコードをかいてるんだけど、 WebApplicationクラスの扱いでちょっとはまった。

アプリケーションごとにひとつ作成するWebApplicationクラス。 このクラスは、アプリケーションごとに1インスタンスしか持たない。 この性質を利用してSingletonなクラスをこの中で生成してアクセスメソッドをつくり、 下記のように使ってた

public class HogeApplication extends WebApplication{
       SingleClass class;

       public HogeApplication(){
       class = new SingleClass();
       }

       public getSingleClass(){
       	      return this.class;
       }
}
public class FugaPage extends WebPage
......

SingleClass class = ((HogeApplication)getApplication()).getSingleClass();	  

HogeApplication内でSingleClassを生成して、getSingleClassメソッドでアクセスする。

この部分をうまく扱うために、WicketTesterを継承するクラスを作成。 ここに、HogeApplication内の処理をコピる。

public class HogeApplicationTester extends WicketTester{
       SingleClass class;

       public HogeApplication(){
       class = new SingleClass();
       }

       public getSingleClass(){
       	      return this.class;
       }
}	  

ただ、これだけだとClassCastExceptionで落ちてしまった。

そこで、Web Applicationクラスのinterfaceを作成して、getSingleClassメソッドを定義。 WebApplicationクラスとWicketTesterでinterfaceをimplementするようにする。

public class HogeApplication extends WebApplication implement IHogeApplication{
.....

public class HogeApplicationTester extends WicketTester implement IHogeApplication{
.....	  

さらにFugaPageクラスも修正

SingleClass class = ((IHogeApplication)getApplication()).getSingleClass();	  

こりゃしんどいわ。 HogeApplication内処理の記述や、interfaceは余計な手間。

Wicket1.3ではBaseWicketTesterクラスが新たに導入されて、 ApplicationクラスをWicketTesterのコンストラクタに引数で与えられるのでだいぶ楽。