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使ってやるときって、どうやって出力先を指定できるんでしょうかね?もう少し見てみましょうね私。