2016-07-30 2 views
2

Я пытаюсь издеваться над статическим методом с помощью EasyMock + PowerMock. Если я не издеваюсь над статическим методом, то получаю исключение java.lang.ExceptionInInitializerError, но с другой трассировкой стека, которая связана исключительно с моими кодовыми файлами, и ошибка очевидна. Однако, если я издеваюсь над статическим методом с помощью EasyMock + PowerMock, строка PowerMock.mockStaticNice (Classname.class) генерирует одно и то же исключение, но с другой трассировкой стека. Трассировка стека является:
java.lang.ExceptionInInitializerError при издевательском статическом методе с использованием 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) 
............................ 



линия 125 является PowerMock.mockStaticNice (Classname.class)

Я уже пробовал это:
1) Упоминание имя класса, содержащий статический метод в PrepareForTest ({class1.class, class2.class, class3.class})
2) Мокетные статические методы в @ Перед аннотацией.

Я застрял в этой проблеме последние 2 дня. Просьба предложить решения.

+0

Только для записи: вы понимаете, что * статический * - это ненормальность, которую просто следует избегать в хороших конструкциях OO? И сюрприз: никаких статических вызовов, нет необходимости в PowerMock. – GhostCat

+0

Я понимаю это. Но я просто редактирую чей-то предыдущий код, поэтому у меня нет никакого выбора, кроме издевательского статического метода. – Siddharth

+0

Ну, вы можете ** добавить ** класс интерфейса/оболочки и изменить статический вызов на использование этой оболочки; но конечно; который несет определенный риск; и в этом случае это, вероятно, не стоит усилий. В этом смысле: я редко вижу здесь ответы, которые действительно говорят «вот как вы его работаете с powermock»; так что, возможно, вам лучше отправляться в группу Google Powermock: https://groups.google.com/forum/#!forum/powermock – GhostCat

ответ

4

Как я понял из вашего объяснения, ExceptionInInitializerError бросается во время статической инициализации класса? Я сделал такой вывод, потому что, согласно stacktrace, линия PowerMock.mockStaticNice(Classname.class) - это первое место, где загружается класс Classname.

В этом случае вы должны использовать @SuppressStaticInitializationFor( PackageName.ClassName`). Более подробную информацию вы можете найти в документации PowerMock: Suppress Unwanted Behavior

+0

Спасибо! Я тоже пробовал это, но просто написал имя класса в строке подавления, не включил имя пакета. Теперь работает. – Siddharth

Смежные вопросы