参考:Unit Testing With Local Service Implementations - Google App Engine - Google Code
1.テスト実行環境を作る
まずは、appengine-api-stubs.jarとappengine-local-runtime.jarへクラスパスを通す。これらはappengineのsdkをダウンロードしたフォルダのlib/implの下にあります。
2009.09.14追記:appengine-local-runtime.jarをWEB-INF/lib下に配置しておくと、ローカルでのGAE/Jサーバーの起動に失敗します。jarはlib以外に配置してください。詳しくは「ローカルでGAEサーバーが動かなくなった?!」
その後、上記ページを参考にして(というか、そっくりコピペして)、TestEnvironmentクラスを作成。
import com.google.apphosting.api.ApiProxy;
import java.util.HashMap;
import java.util.Map;
class TestEnvironment implements ApiProxy.Environment {
public String getAppId() {
return "test";
}
public String getVersionId() {
return "1.0";
}
public String getEmail() {
throw new UnsupportedOperationException();
}
public boolean isLoggedIn() {
throw new UnsupportedOperationException();
}
public boolean isAdmin() {
throw new UnsupportedOperationException();
}
public String getAuthDomain() {
throw new UnsupportedOperationException();
}
public String getRequestNamespace() {
return "";
}
public Map<String, Object> getAttributes() {
return new HashMap<String, Object>();
}
}
2.基本クラスを作成
1で作成したTestEnvironmentを継承してLocalServiceTestCaseクラスを作る。ローカルサービスを簡単にテストできるようにするための基本クラス。
import java.io.File;
import com.google.appengine.tools.development.ApiProxyLocalImpl;
import com.google.apphosting.api.ApiProxy;
import junit.framework.TestCase;
public class LocalServiceTestCase extends TestCase {
@Override
public void setUp() throws Exception {
super.setUp();
ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment());
ApiProxy.setDelegate(new ApiProxyLocalImpl(new File(".")) {
});
}
@Override
public void tearDown() throws Exception {
// not strictly necessary to null these out but there's no harm either
ApiProxy.setDelegate(null);
ApiProxy.setEnvironmentForCurrentThread(null);
super.tearDown();
}
}
3.Datastore Testのための拡張クラス作成
今回、テスト目的がデータストアのチェックだったので、データストアの中身をチェックする時、毎回データをクリーンにしてからテストが実行できるように、LocalServiceTestCaseを継承した以下のようなLocalDatastoreTestCaseクラスも作成。
import com.google.appengine.api.datastore.dev.LocalDatastoreService;
import com.google.appengine.tools.development.ApiProxyLocalImpl;
import com.google.apphosting.api.ApiProxy;
public class LocalDatastoreTestCase extends LocalServiceTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
ApiProxyLocalImpl proxy = (ApiProxyLocalImpl) ApiProxy.getDelegate();
proxy.setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY,
Boolean.TRUE.toString());
}
@Override
public void tearDown() throws Exception {
ApiProxyLocalImpl proxy = (ApiProxyLocalImpl) ApiProxy.getDelegate();
LocalDatastoreService datastoreService = (LocalDatastoreService) proxy
.getService("datastore_v3");
datastoreService.clearProfiles();
super.tearDown();
}
}
4.TestCaseを書いてみよう
ここまで終わってようやく自分のテストケースを実行できるようになりました。早速テストケースを書いて実行してみます。3で作ったLocalDatastoreTestCaseを継承して作ります。
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Query;
import hoge.Mutter;
import hoge.rpc.MutterUtils;
import hoge.test.LocalDatastoreTestCase;
public class TestMutterUtils extends LocalDatastoreTestCase {
public void testAdd() {
MutterUtils mu = new MutterUtils();
//追加処理
//追加後データ件数が1件増えていることを確認
Query query = new Query(Mutter.class.getSimpleName());
assertEquals(1, DatastoreServiceFactory.getDatastoreService().prepare(
query).countEntities());
}
public void testGetMutterOf() {
MutterUtils mu = new MutterUtils();
//追加処理
//追加後データ件数が1件増えていることを確認
List<Mutter> mutters = mu.getMutterOf(userName);
Query query = new Query(Mutter.class.getSimpleName());
assertEquals(1, DatastoreServiceFactory.getDatastoreService().prepare(
query).countEntities());
//追加後のデータを検証
for (Mutter mutter : mutters) {
assertEquals("期待した文字列", mutter.getMessage());
}
}
}
テストケースを右クリックして「実行」→「JUnitテスト」をクリックしてテストを実行します。やっぱりローカルでテストできると安心ですねぇ。
0 件のコメント :
コメントを投稿