メンテナンス用のコントローラを作成してテストを行おうと思って、テストコードを
書いていました。
テストコードをそのまま掲載するわけにはいかないので、適当なコードを載せます。
public class HogeControllerTest extends ControllerTestCase { private HogeService service = new HogeService(); @Override public void setUp() throws Exception { super.setUp(); // データの登録 Hoge hoge = new Hoge(); hoge.setId(1); hoge.setName("abcd"); service.put(hoge); } @Test public void run() throws Exception { ApiProxy.setEnvironmentForCurrentThread(new UnitTestEnvironment()); tester.start("/hoge"); HogeController controller = tester.getController(); assertThat(controller, is(notNullValue())); assertThat(tester.isRedirect(), is(false)); assertThat(tester.getDestinationPath(), is(nullValue())); List<Hoge> list = service.query().asList(); assertEquals(1, list.size()); // ここでエラー } }
UnitTestEnvironmentクラスのソースです。
public class UnitTestEnvironment implements Environment { @Override public String getAppId() { return "Unit Tests"; // setupを使う場合はこれにしておかないとquery()でデータが取れない。 } @Override public Map<string, object> getAttributes() { Map<string, object> map = new HashMap<string, object>(); map.put("com.google.appengine.server_url_key", "dummy"); return map; } @Override public String getAuthDomain() { return "gmail.com"; } @Override public String getEmail() { return "admin@gmail.com"; } @Override public String getRequestNamespace() { return ""; } @Override public String getVersionId() { return "unittest"; } @Override public boolean isAdmin() { return true; } @Override public boolean isLoggedIn() { return true; } }
上記のUnitTestEnvironmentだとテストは正常終了します。
これは、setupでのデータストアの書き込み時のapplicationIdと
テスト実行時の呼び出しの時のapplicationIdが一致するからです。
失敗していた時というのが、TaskQueueのテストをしようとして参考にした
UnitTestEnvironmentのapplicationIdが"MyApplicationId"とかにしていたので
setUpの時とapplicationIDが異なってしまっていました。
その影響で、何度queryを実行してもデータが1件も取れないという状況に
陥っていました。
なので、setupを使う時というか、データストアを使ったテストを行う場合は
以下の点に注意した方が良さそうです。
- appidをデータ登録時と参照時で合わせておく。
- Slim3のTestEnvironment.javaで設定されているappIdは"Unit Tests"
2.はsetupを使わず、自分でデータを登録する場合は問題ないと思いますが、
初期データなど使う場合や、事前にlocal_db.binを用意する場合などは
気をつけておかないとデータが取れない現象に遭遇するかもしれません。
以下、参考までに当時の私のG+に投稿したコメントです。
TaskQueueに入っている事を確認するテストで苦戦している様子(Google+)
https://plus.google.com/u/0/114183076079015753160/posts/NUceVDbNKDK
データストアからフィルタなしのqueryでデータが取れなくて苦戦している様子(Google+)
https://plus.google.com/u/0/114183076079015753160/posts/MZhuGtjrwTS
0 件のコメント:
コメントを投稿