2

我想用多个线程测试我的 JDO - DAO,以验证持久层是否知道同步。

这是我在 JUnit 测试中的一段代码

for(int i=0;i<10;i++) {
    Runnable runnable = new UserAccountLifeCycle(..);
    Thread thread = new Thread(runnable);
    thread.start();
}

.. 其中 UserAccountLifeCycle 是一个扩展另一个业务层类并使用以下代码实现“Runnable”的类:

@Override
public void run() {
    CategoryBusiness catBusiness = new CategoryBusiness(..);
    Category cat1 = catBusiness.createEntity(..);
    catBusiness.createEntities(..);
    ContentBusiness conBusiness = new ContentBusiness(..);
    conBusiness.createEntities(..);
}

如果我运行测试,我会得到:

线程“Thread-6”中的异常 java.lang.NullPointerException:没有为此线程注册 API 环境。在 com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:86) 在 com.google.appengine.api.datastore.DatastoreAttributes.(DatastoreAttributes.java:28) 在 com.google.appengine.api。 datastore.AsyncDatastoreServiceImpl.getDatastoreAttributes(AsyncDatastoreServiceImpl.java:952) 在 com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.getDatastoreType(AsyncDatastoreServiceImpl.java:944) 在 com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.get(AsyncDatastoreServiceImpl. java:267) 在 com.google.appengine.api.datastore.DatastoreServiceImpl$1.runInternal(DatastoreServiceImpl.java:78) 在 com.google.appengine.api.datastore。

如果我运行此代码有效:

for(int i=0;i<10;i++) {
    UserAccountLifeCycle lifeCycle = new UserAccountLifeCycle(i,testUser.getKey());
    lifeCycle.run();
}

(我知道它不会将该方法作为线程运行,但它旨在证明 JUnit 测试已通过GAE 本地测试正确配置)

4

2 回答 2

2

尽管 App Engine Java 运行时支持线程,但 dev_appserver 不支持。因此,在本地开发环境中测试并发性的结果不能代表生产环境。

于 2012-04-11T04:37:20.120 回答
0

您可以在新线程中尝试此处建议的解决方案:

将数据预加载到 GAE 开发服务器数据存储中的验收测试

于 2012-04-09T02:30:29.670 回答