初歩的なハマリ具合
前回参考にさせていただいたid:shin1oさんのこちらの資料のなかでデータをputする前に自動採番済みのkeyを取得できる的な実装が1.2.5から加わっているらしいということは分かったのですが、下記のコードを実行するとallocateIds()なんて無いよって言われてinvokeエラーになってしまっていた。
@Test public void testInsertNotOwned() throws EntityNotFoundException { DatastoreService service = DatastoreServiceFactory.getDatastoreService(); KeyRange parentKeys = service.allocateIds("Parent", 1); Key parentKey = parentKeys.getStart(); KeyRange childKeys = service.allocateIds(parentKey, "Child", 2); }
原因はお恥ずかしいことだった。大体想像つくだろうがよ俺。要は以下の部分。このようにJunitで動かす場合、ApiProxyLocalImplとかは自分で設定してあげる必要があるんですが(ローカル環境で実行する場合は自動でサーバが設定するみたい) だからJunitでなくローカルではちゃんとallocateIds()のコード実行できたのね。
package jp.co.example.kijitoraneko.test; import java.io.File; import junit.framework.TestCase; import com.google.appengine.api.datastore.dev.LocalDatastoreService; import com.google.appengine.tools.development.ApiProxyLocalImpl; import com.google.apphosting.api.ApiProxy; public class LocalBaseTestCase extends TestCase { public void setUp(){ ApiProxy.setEnvironmentForCurrentThread(new TestEnviroment()); ApiProxyLocalImpl proxy = new ApiProxyLocalImpl(new File(".")){}; proxy.setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY, Boolean.TRUE.toString()); ApiProxy.setDelegate(proxy); } public void tearDown(){ ApiProxy.clearEnvironmentForCurrentThread(); }
で、どうしてだめだったかというと、appengine-api-stubs.jarとappengine-local-runtime.jarが1.2.4かなんかのjarファイルのままだったみたいだ。jarを1.2.6のものにしたらちゃんと動いた。上のLocalBaseTestCaseのコードは、ほぼGAE本のコードのままなのだけれども、この辺はとっても面白そうなので少しずつ見ていきたいと思う。
もうすぐですね。楽しみです。