2016-07-30 41 views
2

Ich versuche, statische Methode mit EasyMock + PowerMock zu verspotten. Wenn ich die statische Methode nicht vortäusche, dann bekomme ich die Ausnahme java.lang.ExceptionInInitializerError aber mit einem anderen Stack-Trace, der rein auf meine Code-Dateien zurückzuführen ist und der Fehler ist offensichtlich. Wenn ich jedoch die statische Methode mit EasyMock + PowerMock mokiere, löst die Zeile PowerMock.mockStaticNice (Classname.class) dieselbe Ausnahme aus, aber mit einem anderen Stack-Trace. Der Stack-Trace ist:
java.lang.ExceptionInInitializerError beim Mocking statische Methode mit EasyMock + PowerMock

java.lang.ExceptionInInitializerError 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:348) 
     at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:386) 
     at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219) 
     at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
     at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317) 
     at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:175) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:114) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:88) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:79) 
     at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212) 
     at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163) 
     at org.powermock.api.easymock.PowerMock.mockStaticNice(PowerMock.java:331) 
     at PackageName(ClassName.java:125) 
............................ 



Die Linie 125 ist PowerMock.mockStaticNice (ClassName.class)

ich dies bereits versucht haben:
1) Klassennamen enthält statische Methode in PrepareForTest Erwähnen ({class1.class, class2.class, class3.class})
2) Mock statische Methoden in @Before Annotation.

Ich bin mit diesem Problem für die letzten 2 Tage fest. Bitte schlagen Sie Lösungen vor.

+0

Nur für den Rekord: Sie verstehen, dass * statische * ist eine Anomalie, die einfach in guten OO-Designs vermieden werden sollte? Und Überraschung: keine statischen Anrufe, keine Notwendigkeit für PowerMock. – GhostCat

+0

Ich verstehe das. Aber ich bearbeite nur den vorherigen Code von jemandem, also habe ich keine andere Möglichkeit als die statische Methode zu verspotten. – Siddharth

+0

Nun, Sie könnten ** ** eine Interface/Wrapper-Klasse hinzufügen und den statischen Aufruf ändern, um diesen Wrapper zu verwenden; aber natürlich; das birgt ein gewisses Risiko; und in diesem Fall ist es wahrscheinlich nicht die Mühe wert. In diesem Sinne: Ich sehe hier selten Antworten, die wirklich sagen "So funktioniert es mit powermock"; Vielleicht solltest du also besser in die Powermock Google Group posten: https://groups.google.com/forum/#!forum/powermock – GhostCat

Antwort

4

Wie ich von Ihrer Erklärung verstanden habe, wird die ExceptionInInitializerError während der statischen Initialisierung der Klasse geworfen? Ich habe eine solche Schlussfolgerung gemacht, weil nach Zeile stacktrace die Zeile PowerMock.mockStaticNice(Classname.class) ein erster Ort ist, an dem die Klasse Classname geladen wird.

In diesem Fall müssen Sie @SuppressStaticInitializationFor( PackageName.ClassName`) verwenden. Weitere Informationen finden Sie in PowerMock-Dokumentation: Suppress Unwanted Behavior

+0

Danke! Ich habe das auch versucht, aber nur den Klassennamen in die Suppress-Zeile geschrieben, den Paketnamen nicht angegeben. Es funktioniert jetzt. – Siddharth