我想用多线程测试我的JDO-DAO,以验证持久层是否知道同步。用线程测试GAE数据存储
这是我在JUnit测试
for(int i=0;i<10;i++) {
Runnable runnable = new UserAccountLifeCycle(..);
Thread thread = new Thread(runnable);
thread.start();
}
..其中UserAccountLifeCycle是扩展另一个业务层类和实现此代码“可运行”一类的代码:
@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) at com.google.appengine.api.datastore.DatastoreServiceImpl $ 1.runInternal(DatastoreServiceImpl.java:78) 在 com.google.appengine.api.datastore.DatastoreServiceImpl $ 1.runInternal(DatastoreServiceImpl.java:75) 在 com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:31) 在 com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:75) 在 com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:62) 在 org.datanucleus。 store.appengine.RuntimeExceptionWrappingDatastoreService.get(RuntimeExceptionWrappingDatastoreService.java:56) at org.datanucleus.store.appengine.DatastorePersistenceHandler.get(DatastorePersistenceHandler.jav一:100) 在 org.datanucleus.store.appengine.DatastorePersistenceHandler.get(DatastorePersistenceHandler.java:112) 在 org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:517) 在 有机.datanucleus.state.JDOStateManagerImpl.validate(JDOStateManagerImpl.java:4263) 在 org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2444) 在 org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1671 ) at org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1767) at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.getObjectById(DatastoreJDOPersistenceManager.java:73) 在 it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories(GaedatastoreUserAccountDAO.java:174) 在 it.icaroproject .main.business.CategoryBusiness.createEntities(CategoryBusiness.java:83) at it。icaroproject.main.business.CategoryBusiness.createEntity(CategoryBusiness.java:76) at it.icaroproject.test.business.UserAccountLifeCycle.run(UserAccountLifeCycle.java:52) at java.lang.Thread.run(Thread.java :680)
如果我运行此代码的工作:
for(int i=0;i<10;i++) {
UserAccountLifeCycle lifeCycle = new UserAccountLifeCycle(i,testUser.getKey());
lifeCycle.run();
}
(我知道这不运行的方法作为线程,但它旨在为JUnit测试配置正确的证明与GAE local testing)
这里是it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories(GaedatastoreUserAccountDAO.java:174代码:tempUser =(UserAccount)pm.getObjectById(UserAccount.class,USERKEY); – 2012-04-09 02:18:39