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)
hier ist der Code bei it.icaroproject.main.persistence.dao.GaedatastoreUserAccountDAO.addCategories (GaedatastoreUserAccountDAO.java:174: tempuser = (Useraccount) pm.getObjectById (UserAccount.class, USERKEY); –