初歩的なハマリ具合

前回参考にさせていただいた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本のコードのままなのだけれども、この辺はとっても面白そうなので少しずつ見ていきたいと思う。


もうすぐですね。楽しみです。