2

Ich möchte meine JDO-DAO mit mehreren Threads testen, um zu überprüfen, ob die Persistenzschicht die Synchronisation kennt.Testen von GAE-Datenspeichern mit Threads

Hier ist mein Stück Code in einem JUnit-Test

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

.. wo UserAccountLifeCycle eine Klasse, die eine andere Business-Schicht-Klasse erweitert und implementiert "Runnable" mit diesem Code:

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

Wenn ich den Test ausführen, erhalte ich:

Ausnahme in th lies "Thread-6" java.lang.NullPointerException: Für dieses Thema ist keine API Umgebung registriert. bei com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId (DatastoreApiHelper.java:86) bei com.google.appengine.api.datastore.DatastoreAttributes. (DatastoreAttributes.java:28) bei com.google .appengine.api.datastore.AsyncDatastoreServiceImpl.getDatastoreAttributes (AsyncDatastoreServiceImpl.java:952) bei com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.getDatastoreType (AsyncDatastoreServiceImpl.java:944) bei com.google.appengine.api .datastore.AsyncDatastoreServiceImpl.get (AsyncDatastoreServiceImpl.java:267) unter com.google.appengine.api.datastore.DatastoreServiceImpl $ 1.runInternal (DatastoreServiceImpl.java:78) bei com.google.appengine.api.datastore.DatastoreServiceImpl $ 1.runInternal (DatastoreServiceImpl.java:75) bei com.google.appengine.api.datastore.TransactionRunner.runInTransaction (TransactionRunner.java:31) bei com.google.appengine.api.datastore.DatastoreServiceImpl.get (DatastoreServiceImpl.java:75) bei com.google.appengine.api.datastore.DatastoreServiceImpl.get (DatastoreServiceImpl.java:62) bei org.datanucleus. store.appengine.RuntimeExceptionWrappingDatastoreService.get (RuntimeExceptionWrappingDatastoreService.java:56) unter org.datanucleus.store.appengine.DatastorePersistenceHandler.get (DatastorePersistenceHandler.jav a: 100) bei org.datanucleus.store.appengine.DatastorePersistenceHandler.get (DatastorePersistenceHandler.java:112) bei org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject (DatastorePersistenceHandler.java:517) bei org .datanucleus.state.JDOStateManagerImpl.validate (JDOStateManagerImpl.java:4263) bei org.datanucleus.ObjectManagerImpl.findObject (ObjectManagerImpl.java:2444) bei org.datanucleus.jdo.JDOPersistenceManager.getObjectById (JDOPersistenceManager.java:1671) um org.datanucleus.jdo.JDOPersistenceManager.getObjectById (JDOPersistenceManager.java:1767) um org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.getObjectById (DatastoreJDOPersistenceManager.java:73) bei it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories (GaedatastoreUserAccountDAO.java:174) bei it.icaroproject .main.business.CategoryBusiness.createEntities (CategoryBusiness.java:83) bei es.icaroproject.main.business.CategoryBusiness.createEntity (CategoryBusiness.java:76) unter it.icaroproject.test.business.UserAccountLifeCycle.run (UserAccountLifeCycle.java:52) bei java.lang.Thread.run (Thread.java : 680)

Wenn ich diesen Code ausführen funktioniert:

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

(ich weiß, dass es nicht die Methode als Thread läuft, aber es wird als Beweis beabsichtigt, dass JUnit Test richtig konfiguriert ist mit GAE local testing)

+0

hier ist der Code bei it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories (GaedatastoreUserAccountDAO.java:174: tempuser = (Useraccount) pm.getObjectById (UserAccount.class, USERKEY); –

Antwort

2

Obwohl die App Engine Java-Runtime-Threads unterstützt, der dev_appserver nicht. Die Ergebnisse der Parallelitätsprüfung der lokalen Entwicklungsumgebung werden daher nicht repräsentativ für die Produktionsumgebung sein.

+0

Vielen Dank für Sie antworten! .. Ich werde es mit mehreren HTTP-Aufrufen an meine App testen, die auf einem Testprojekt in GAE implementiert sind –