4

私のアプリケーションには、アプリケーション層に挿入する一連のDAOがあります。私が書いている受け入れテストでは、dev_serverデータストアにデータをプリロードしたいので、JUnitテストで同じSpring構成を使用して(@ContextConfigurationアノテーションを使用)、関連するDAOのインスタンスをテストに挿入します。私が実際にいくつかのデータを保存するために行くとき、例えば:

dao.add(entity)

「このスレッドにはAPI環境が登録されていません」と恐ろしい思いをします。

Caused by: java.lang.NullPointerException: No API environment is registered for this thread.
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:108)
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:118)
    ....

これはおそらく、私のテストケースがアプリの詳細を含むGAE application-web.xmlを読み取っていないためです(ここでは、私は本当に間違っている可能性があると推測しています)。そのため、dev_serverで実行されているアプリが読み取り/書き込みを行っているのと同じデータストアに書き込むことはわかりません。

アプリと同じデータストアを「指す」ようにテストを取得するにはどうすればよいですか?アプリとテストの両方に挿入できる「データソース」メカニズムはありますか?テストを取得して、データストアAPIに必要な構成を強制的に読み取らせる方法はありますか?

4

3 に答える 3

3

これは、開発データストアに接続する単体テストを実行する方法について説明しているページです。これはあなたが探しているようなものですか?基本的に、テスト用の環境をセットアップするために使用できるLocalServiceTestHelperとLocalDatastoreServiceTestConfigの2つのクラスについて説明します。与えられた例は単体テスト用ですが、それはあなたの状況にも役立つと思います。

次に、開発データストアをディスクに書き込むか、メモリに保持するかなどを構成できます(テストを高速化するため)。このデータを開発サーバーと同じ場所に配置したい場合は、デフォルトが「メモリ内」オプションであると思うので、おそらくこれを調整する必要があります。javadocを見ると、必要なファイルを指すことができる「setBackingStoreLocation」メソッドがあります。

于 2011-01-22T23:11:43.707 に答える
0

私は解決策を見つけました!!!!

何らかの理由で、テストデータストアの名前空間、AppID、およびAuthDomainフィールドは、dev_serverのフィールドと一致する必要があります。そうすると、dev_serverはテストによって挿入されたエンティティを確認できます。

次のステートメントを使用して、環境(dev_serverまたはテストコード)の値を確認できます。

System.out.println(NamespaceManager.get());
System.out.println(ApiProxy.getCurrentEnvironment().getAppId());
System.out.println(ApiProxy.getCurrentEnvironment().getAuthDomain());

LocalServiceTestHelperのインスタンス(例:gaeHelper)で、テスト環境の値を設定できます

// the NamespaceManager is thread local.
NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace());
gaeHelper.setEnvAppId(<the name of your app in appengine-web.xml>);
gaeHelper.setEnvAuthDomain("gmail.com");

次に、dev_serverにエンティティが表示されます。ただし、同期の問題のため、dev_serverの開始後にテストがデータストアに書き込む場合、ファイルの再読み取りを強制できない限り、dev_serverはデータストアを認識しません(まだ理解していません)。それ以外の場合は、サーバーを再起動する必要があります。

于 2011-02-02T11:34:12.040 に答える
0

回避策を見つけましたが、Javaのローカル単体テストの記事で説明されているように、各テストメソッドはデータストアをクリーンアップしないため、あまり良くありませんが、データストアはテストクラスが実行されるたびにクリーンに開始されます。あなたがそれに注意していれば、それはそれほど悪くはありません。

問題は、を使用する場合SpringJUnit4ClassRunner@Beforeアノテーションを実行する前にSpring環境が作成されることです。解決策は@BeforeClass、の静的変数を使用して使用しLocalServiceTestHelper、Spring環境を設定する前に作成することです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/spring/context-test.xml")
@Transactional
public class MyTest {


    @Inject
    private MyService myService;

    private static final LocalServiceTestHelper helper = 
        new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

    @BeforeClass
    public static void beforeClass() {
        helper.setUp();
    }

    @AfterClass
    public static void afterClass() {
        helper.tearDown();
    }

誰かがより良い解決策を持っているなら、私は聞いてうれしいです!

于 2013-08-26T22:03:26.210 に答える