2

我想用多線程測試我的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

+0

這裏是it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories(GaedatastoreUserAccountDAO.java:174代碼:tempUser =(UserAccount)pm.getObjectById(UserAccount.class,USERKEY); – 2012-04-09 02:18:39

回答

2

雖然App Engine的Java運行時支持多線程,則dev_appserver沒有。因此,本地開發環境測試併發性的結果並不代表生產環境。

+0

非常感謝你的你會回答!我將通過對我的應用進行多次HTTP調用來測試它,並部署在GAE的測試項目中 – 2012-04-13 12:27:13

0

你可以嘗試的解決方案建議您在這裏新線程:

​​3210