GAEのローカルでテストなどをやってみたりしております
お家で陽気にプログラミングの時間です。こちらやこちらを参考にさせていただき、試してみました。大変分かりやすいです。
ただ、私が怠けているうちにSDKは1.3.4になってしまっていまして、new ApiProxyLocalImplができないので(publicになってない)どうするんかとちょろちょろwebを眺めていたら、こんな感じでやれと。はい。わかりました。やってみます。
それでLocalServiceTestHelperというのを使ってやってみたんです。
/** * * LocalServiceTestHelperを使ったテスト。 * appengine-generatedフォルダがどこに出来るのかは、 * どのように指定するのでございますか? * * 1.3.4ではApiProxyLocalImplはnewできないのでございますね。 * * @author kijitoraneko * */ public class KijitoranekoTest extends TestCase{ private final LocalServiceTestHelper helper = new LocalServiceTestHelper( //↓setNoStorage(true)で、 //↓apiProxyLocal.setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY, Boolean.FALSE.toString());を実現 new LocalDatastoreServiceTestConfig().setNoStorage(false), new LocalUserServiceTestConfig(), ) .setEnvIsAdmin(true) .setEnvIsLoggedIn(true) .setEnvAppId("UnitTests") .setEnvVersionId("1.0"); @Before public void setUp() { helper.setUp(); //ApiProxyLocal apiProxyLocal = LocalServiceTestHelper.getApiProxyLocal(); //apiProxyLocal.setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY, Boolean.FALSE.toString()); //apiProxyLocal.makeSyncCall((com.google.apphosting.api.ApiProxy.Environment) new Environment(),"", "", "aaa".getBytes()); } @After public void tearDown() { //helper生成時に、LocalDatastoreServiceTestConfigを設定していると、 //helper.tearDown()内部で、LocalDatastoreServiceTestConfig.tearDown()が、local_db.binの中身をclearしてる? helper.tearDown(); } private void doUserTest() throws EntityNotFoundException { UserService userService = UserServiceFactory.getUserService(); assertEquals(true, userService.isUserAdmin()); assertEquals(true, userService.isUserLoggedIn()); } private void doDataStoreTest() throws EntityNotFoundException { Entity favorite = new Entity("myfavorite"); favorite.setProperty("name", "kijitoraneko"); DatastoreService service = DatastoreServiceFactory .getDatastoreService(); Key favoriteKey = service.put(favorite); List<Entity> movies = new ArrayList<Entity>(); Entity movie1 = new Entity("movie", favoriteKey); movie1.setProperty("name", "tokyostory"); movie1.setProperty("score", "100"); movies.add(movie1); Entity movie2 = new Entity("movie", favoriteKey); movie2.setProperty("name", "The Sweet Here After"); movie2.setProperty("score", "90"); movies.add(movie2); service.put(movies); Entity director = new Entity("director"); director.setProperty("name", "yasujirou"); service.put(director); // putデータをget favorite = service.get(favoriteKey); String name = (String) favorite.getProperty("name"); System.out.println("favorite:" + name); Query q = new Query("movie"); PreparedQuery pq = service.prepare(q); List<Entity> resultsMs = pq.asList(FetchOptions.Builder.withOffset(0)); for (Entity r : resultsMs) { name = (String) r.getProperty("name"); System.out.println("movie:" + name); } } @Test public void testInsert() throws EntityNotFoundException { doUserTest(); doDataStoreTest(); }
それでですね、これを実行するとプロジェクト直下にWEB-INF/appengine-generated/local_db.binが出来るのだけれども、
ApiProxyLocalImplをnewしてのテストでは、
ApiProxyLocalImpl proxy = new ApiProxyLocalImpl(new File("nekoneko")) {};
こんな感じで、WEB-INF/appengine-generated/の生成先はApiProxyLocalImpl生成時に指定できたわけなんですけれどもねぇ。
LocalServiceTestHelperのsetUp()で、デフォルトっぽいApiProxy.EnvironmentとApiProxy.Delegateがセットされてるっぽいけれどもですね。
例えば、
ApiProxyLocal proxy = new ApiProxyLocalFactory().create(new LocalServerEnvironment() { @Override public void waitForServerToStart() throws InterruptedException { } @Override public int getPort() { return 0; } @Override public File getAppDir() { return new File("nekoneko"); } @Override public String getAddress() { return null; } });
new出来なくてもこうすれば、ApiProxyLocalImpl作れたけれども、プロジェクト直下/nekoneko/WEB-INF/appengine-generatedも作成されたけれども。helper使ってやるときって、どうやって出力先を指定できるんでしょうかね?もう少し見てみましょうね私。