CW#05 java.lang.ExceptionInInitializerError: Probleme mit Photo Konstruktor

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

CW#05 java.lang.ExceptionInInitializerError: Probleme mit Photo Konstruktor
Hallo beisammen,

ich schaffe es nicht ein Photo in den Testfällen zu initialisieren, egal ob direkt, mit Factory oder einem Manager , ich bekomme in jedem Fall die folgende Exception:

java.lang.ExceptionInInitializerError
	at org.wahlzeit.model.Photo.<init>(Photo.java:136)
	at org.wahlzeit.model.PrintPhoto.<init>(PrintPhoto.java:19)
	at org.wahlzeit.model.PrintPhotoFactory.createPhoto(PrintPhotoFactory.java:27)
	at org.wahlzeit.model.PrintPhotoFactoryTest.testCreatePhoto(PrintPhotoFactoryTest.java:18)
	...
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException: No API environment is registered for this thread.
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:150)
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:166)
	at com.google.appengine.api.datastore.Key.<init>(Key.java:92)
	at com.google.appengine.api.datastore.Key.<init>(Key.java:82)
	at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:81)
	at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:74)
	at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:62)
	at org.wahlzeit.services.ObjectManager.<clinit>(ObjectManager.java:39)

Dabei ist es auch bei den Verwaltungsklassen egal ob ich den normalen Konstruktor oder die “getInstance” Methode verwende.
Ein bisschen Rumstochern führt dann zur “Photo”-Klasse, Schuld scheint das folgende Segment mit Funktionen der AppEngine zu sein:

    @Id
    Long idLong;
    @Parent
    Key parent = ObjectManager.applicationRootKey;

Hat jemand das gleiche Problem schonmal gehabt und kennt eine Lösung?
Der Originalcode enthält leider keine Tests für die Photos, die man als Referenz nutzen könnte.

1 „Gefällt mir“

CW#05 java.lang.ExceptionInInitializerError: Probleme mit Photo Konstruktor
Hallo mir geht es leider genauso, wenn ich Versuche einen Test für die Klasse PhotoManager zu schreiben.

Wäre gut, wenn jemand eine Lösung dafür hätte.

Danke.


Die Exception “No API environment[…]” stamt von der AppEngine. Zum Unit-Testen sollte man natürlich nicht die “echten” Funktionen davon nutzen, sondern Fakes. Wie man das macht, habe ich hier gefunden: https://cloud.google.com/appengine/docs/standard/java/tools/localunittesting?csw=1


Okay, ich verstehe es nicht, ich habe durch Bruteforce-Copy-Paste aber eine Lösung gefunden:

Man muss innerhalb der Testklasse vor allen Ausführungen den folgenden Code einfügen zum Initialisieren vom AppEngine-Zeug:

    @ClassRule
    public static SysConfigProvider sysConfigProvider = new SysConfigProvider();
    @ClassRule
    public static WebFormHandlerProvider webFormHandlerProvider = new WebFormHandlerProvider();

    @Rule
    public TestRule chain = RuleChain.
            outerRule(new LocalDatastoreServiceTestConfigProvider()).
            around(new RegisteredOfyEnvironmentProvider()).
            around(new UserSessionProvider());

Ich habs aus TellFriendTest rausgeklaut, eventuell kommen auch noch andere Probleme, damit läuft aber zumindest der Konstruktor.