2010-03-12

GAE/J + Slim3 [はじめてのSlim3(4)]

一日、間が空いてしまいました。m(_ _)m
隣の部署で大火事状態のプロジェクトがありヘルプにかり出されたので、更新する時間が取れなかった(;_;)

前回の続き、「Creating a form」の最後のところ...TwitterService#tweet()メソッドを作成してテストがGreen(OK)となった続きから。
  • 次に進む前にTwitterService#tweet()メソッドで何をしているのか確認してみる。
    public Tweet tweet(Map<String, Object> input) {
        Tweet tweet = new Tweet();
        BeanUtil.copy(input, tweet);
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(tweet);
        tx.commit();
        return tweet;
    }
    • BeanUtil.copy()でTweetオブジェクトに入力値を設定している。
      このcopy()メソッドが便利で第一引数(Mapオブジェクト)のKey値と同じ名前の"第二引数のプロパティ"にValue値をセットしてくれる。(contentに値が設定されることになる)普通は一つ一つgetter()メソッドを使ってセットするコードを書くのだが、こういう単純作業は人がやるべき作業じゃないよね。
    • Datastore.put(tweet)でTweetオブジェクトをデータストアに格納している。
      App Engineデータストアを扱う場合「Datastore Java API」で説明されているように、JDO, JPA, 低レベりAPIのいずれかを使用することになるが、ここではSlim3のDatastoreを使っている。これはタイプセーフな低レベルAPIのラッパーということでJDO,JPAを使うより早いらしい。
  • では、続き...
    今作ったTwitterService#tweet()メソッドをTweetControllerから呼んで、入力された"tweet(つぶやき)"をデータストアに格納されるようにする。
    ということで、この仕様をTweetControllerTestに書く。既にテストメソッドrun()は作成されているので下記のように修正する。
    @Test
    public void run() throws Exception {
        tester.param("content", "Hello");
        tester.start("/twitter/tweet");
        TweetController controller = tester.getController();
        assertThat(controller, is(notNullValue()));
        assertThat(tester.isRedirect(), is(true));
        assertThat(tester.getDestinationPath(), is("/twitter/"));
        Tweet stored = Datastore.query(Tweet.class).asSingle();
        assertThat(stored, is(notNullValue()));
        assertThat(stored.getContent(), is("Hello"));
    }
  • テストクラスを修正したので、テスト実行...Red(NG)
    TweetControllerはまだ修正していないので、今の時点ではRed(NG)で"正常"
  • では、テストが通りようにTweetControllerを修正する。"return redirect(basePath)"の前に一行追加する。
    service.tweet(new RequestMap(request));
  • テストを実行して...はい、Green(OK)
  • では実際に動かしてみる。「GAE/J + Slim3 [準備]」で作成しておいた"Webアプリケーション"が起動されていることを確認して、ブラウザから http://localhost:8888/twitter/ にアクセスする。
  • テキスト欄に何か文字を入力して[tweet]ボタンをクリックする。何も変化はないけど、入力した文字列がデータストアに格納されているはず。
  • データストアの内容を確認するにはブラウザで http://localhost:8888/_ah/admin/ にアクセスする。これはローカル開発用のコンソールでデータストアやTask Queueの内容が確認できる。
  • "Datastore Viewer"をクリックして、[List Entries]をクリックすると、データストアに格納されているデータの内容が表示される。ここに先ほど入力した文字列のデータが表示されているはずだ。
あと残りは入力したtweetを一覧表示する処理をつくる「Listing tweets」だ、今度の土日でやろう。p(^^)g

0 件のコメント: