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利用時のテストケース
WicketとSeasar2でのテストの書き方メモ。
S2WicketのS2WicketFilterを使っている。
HTMLファイルをWEB-INFなどに入れている場合はMarkupNotFoundExceptionが発生するのでEclipseのJUnitのプロパティで作業ディレクトリを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); } }
追記:テストをぽちぽち追加していくと、うまく動かないことが度々ある。今は見送り。