AppEngine/Javaで、開発サーバで実行するときのテストデータの初期状態を作っておきたい時、私はよくAppEngine SDKのLocalServiceTestHelper
を使ってテスト環境を作成してデータ投入し、そこで作成したファイル(local_db.bin)をwar/WEB-INF/appengine-generatedフォルダにコピーしていました。これと同じことをSlim3のAppEngineTester
を使ってできないかなー?と思って試してみました。
Slim3のAppEngineTester#tearDown()
はテスト中に投入されたデータは全部消してしまう(それが便利なわけですが)仕様です。これはtearDown()をオーバーライドして削除処理をしないようにすれば回避できます。
それだけだと良いんですが、環境終了時にApiProxyLocalImpl#stop()
を呼んでいません。これが無いとデータがlocal_db.binに永続化されないので、ファイルが作成できません。そこで次のようなAppEngineTester
のサブクラスを作って使うことにしました。テスト中に投入したデータのクリア処理を外し、各LocalServiceクラスを停止するためのApiProxyLocalImpl#stop()
を実行するようにしただけです。
以下のように使うことになります。
- テストデータ投入前に、上記の
AppEngineTester
のサブクラスをインスタンス化し、setUp()を実行する - 開発サーバで実行するときのアプリケーションIDを返す
ApiProxy.Environment
のインスタンスをApiProxy#setEnvironmentForCurrentThread()
で設定する - テストデータを投入する
- 上記の
AppEngineTester
のサブクラスのオブジェクトのtearDown()
を実行する build/test-classes/WEB-INF/appengine-generated/local_db.bin
をwar/WEB-INF/appengine-generated/local_db.bin
にコピーする
データファイルに保存されるエンティティにはアプリケーションIDも合わせて永続化されるので、データ投入時と開発サーバ実行時で同じになる必要がある点に注意が必要です。
0 件のコメント:
コメントを投稿