ログ日記

作業ログと日記とメモ

GWTで使えるクラスのメモ

twitterにも書いたんだけど、どうしてGWTでKeyクラスが使えるんだろうと思っていた。
それから、Datastore.keyToString(model.getKey())をGWTのクライアント側でやりたいよねと。


でも試しにmodel.getKey().getName()を実行してみたらちゃんと取得できた。
GWTのクライアント側でもKeyクラスのメソッドは使えるようだ。
ということは、KeyがStringで生成されていることが確定しているならgetNameを呼び出せば元の文字列が取得できるわけだ。
わざわざサーバーに問い合せてサービスの方でkeyToStringを呼び出すか、Keyの文字列をコピーして別のフィールドに持たせようかと思っていたところだった。


何故だろうとソース探索。
GWTにはGAE/Jのコードは入ってなさそうだ。
それからslim3のコードを見ていくと、org.slim3.gwt.emul.S3Emulation.gwt.xmlのファイルがある。
そこには前に書いた super-source *1 があり、ルートが指定されている。
改めてよく見るとSlim3に com.google.appengine.datastore.Key_CustomFieldSerializer などのクラスがある。
KeyなどのappengineのクラスはソースファイルがないのでGWT用のJavaScriptは生成できないが、ここでシリアライザを使ってGWTでも使えるようにしているようだ。
公式にGWTがサポートされているっていうのはいいね。

S2Wicket利用時のテストケース

WicketSeasar2でのテストの書き方メモ。
S2WicketのS2WicketFilterを使っている。
HTMLファイルをWEB-INFなどに入れている場合はMarkupNotFoundExceptionが発生するのでEclipseJUnitのプロパティで作業ディレクトリをsrc/main/webappなどにしておく。

public class UserPageTest extends S2TestCase {
    private WicketTester tester;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        include("app.dicon");
        tester = new WicketTester(new MyWebApp());
        tester.getApplication().getComponentInstantiationListeners().add(new ComponentInjectionListener());
    }

    public void login(){

    }
    public void testLogin(){
        tester.startPage(UserPage.class);
        tester.assertRenderedPage(LoginPage.class);

        FormTester form = tester.newFormTester("entity.account");
        assertNotNull(form);
        form.setValue("id", "test");
        form.setValue("password", "test");
        form.submit();

        tester.assertRenderedPage(UserPage.class);
    }
}


EasyMockを使ってログイン処理をMock化。

public class UserPageTest extends S2TigerTestCase {
    private WicketTester tester;

    @EasyMock(register=true)
    private AccountService accountService;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        include("app.dicon");
        tester = new WicketTester(new MyWebApp());
        tester.getApplication().getComponentInstantiationListeners().add(new ComponentInjectionListener());
    }

    private Account setUpAccount(String[] roles){
        Account account = new Account();
        account.accountId = 1;
        account.enable = true;
        account.name = "admin";
        account.loginId = "admin";

        account.accountRoleList = new ArrayList<AccountRole>();
        for (String v: roles){
            AccountRole role = new AccountRole();
            role.accountId = account.accountId;
            role.account = account;
            role.roleValue = v;
            account.accountRoleList.add(role);
        }
        return account;
    }

    public void recordLogin(){
        Account account = setUpAccount(new String[]{"admin", "user"});
        expect(accountService.login("admin", "admin")).andReturn(account);
        expect(accountService.findById(1)).andReturn(account);
    }

    public void testLogin(){
        tester.startPage(UserPage.class);
        tester.assertRenderedPage(LoginPage.class);

        FormTester form = tester.newFormTester("entity.account");
        assertNotNull(form);
        form.setValue("id", "admin");
        form.setValue("password", "admin");
        form.submit();

        tester.assertRenderedPage(UserPage.class);
    }
}


追記:テストをぽちぽち追加していくと、うまく動かないことが度々ある。今は見送り。