PowerMockito (с Mockito) терпя неудачу с ExceptionInInitializerError
мы используем Powermockito с Mockito, чтобы издеваться над некоторыми статическими классами. Кажется, есть java.lang.ExceptionInInitializerError
бросали каждый раз.
можете ли вы помочь мне определить, где проблема?
тестируемый класс Java
package com.myproject.myproduct.search.domain;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
public class MyQueryBuilder {
public MultiMatchQueryBuilder getMultiMatchQueryBuilder() {
MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery("term", "field1");
builder.field("field1",200.9f);
return builder;
}
}
Junit тест с Powermock runner
package com.myproject.myproduct.search.domain;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(QueryBuilders.class)
public class MyQueryBuilderTest {
private MyQueryBuilder myQueryBuilder;
@Test
public void test() {
PowerMockito.mockStatic(QueryBuilders.class);
MultiMatchQueryBuilder builder = PowerMockito.mock(MultiMatchQueryBuilder.class);
}
}
вот именно. Тестовый код не работает, как только я пытаюсь глумиться MultiMatchQueryBuilder.
это Исключение:
java.ленг.ExceptionInInitializerError в орг.решение Elasticsearch.общий.лесозаготовительный.DeprecationLogger.(DeprecationLogger.java: 138) в орг.решение Elasticsearch.общий.Парсфилд.(Парсфилд.java: 35) на орг.решение Elasticsearch.индекс.запрос.AbstractQueryBuilder.(AbstractQueryBuilder.java: 53) на солнце.отражать.GeneratedSerializationConstructoraccessor7.метод newinstance(неизвестный Источник) в Ява.ленг.отражать.Конструктор.newInstance (конструктор.java: 423) на орг.objenesis.формирователь экземпляров.солнце.SunReflectionFactoryInstantiator.newInstance (SunReflectionFactoryInstantiator.java: 40) в орг.objenesis.ObjenesisBase.метод newinstance(ObjenesisBase.java: 59) at орг.mockito.внутренний.создание.jmock.ClassImposterizer.createProxy (ClassImposterizer.java: 128) на орг.mockito.внутренний.создание.jmock.ClassImposterizer.imposterise (ClassImposterizer.Ява:63) на орг.powermock.прикладной программный интерфейс.mockito.внутренний.mockcreation.MockCreator.createMethodInvocationControl (MockCreator.java: 111) на орг.powermock.прикладной программный интерфейс.mockito.внутренний.mockcreation.MockCreator.МОК (MockCreator.java: 60) в орг.powermock.прикладной программный интерфейс.mockito.PowerMockito.макет(PowerMockito.java: 143) на com.спартасистемы.стратас.поиск.домен.MyQueryBuilderTest.testBoostSetProperly (MyQueryBuilderTest.java: 22) в Sun.отражать.NativeMethodAccessorImpl.invoke0 (собственный метод) at солнце.отражать.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 62) на солнце.отражать.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 43) на Яве.ленг.отражать.Метод.метод Invoke.java: 498) at орг.тесты JUnit.внутренний.бегуны.TestMethod.invoke(TestMethod.java: 68) at орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod (PowerMockJUnit44RunnerDelegateImpl.java:310) на орг.тесты JUnit.внутренний.бегуны.MethodRoadie$2.run (MethodRoadie.java: 88) на орг.тесты JUnit.внутренний.бегуны.Методроди.runBeforesThenTestThenAfters (MethodRoadie.Ява:96) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest (PowerMockJUnit44RunnerDelegateImpl.java: 294) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper (PowerMockJUnit47RunnerDelegateImpl.java: 127) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest (PowerMockJUnit47RunnerDelegateImpl.Ява:82) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters (PowerMockJUnit44RunnerDelegateImpl.java: 282) на орг.тесты JUnit.внутренний.бегуны.Методроди.runTest (MethodRoadie.Ява:86) в орг.тесты JUnit.внутренний.бегуны.Методроди.run (MethodRoadie.Ява:49) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod (PowerMockJUnit44RunnerDelegateImpl.java: 207) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods (PowerMockJUnit44RunnerDelegateImpl.java: 146) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java: 120) на орг.тесты JUnit.внутренний.бегуны.ClassRoadie.runUnprotected(ClassRoadie.java: 33) на орг.тесты JUnit.внутренний.бегуны.ClassRoadie.runProtected(ClassRoadie.java: 45) на орг.powermock.модули.junit4.внутренний.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java: 122) на орг.powermock.модули.junit4.общий.внутренний.impl.JUnit4TestSuiteChunkerImpl.run (JUnit4TestSuiteChunkerImpl.java: 104) на орг.powermock.модули.junit4.общий.внутренний.impl.AbstractCommonPowerMockRunner.run (AbstractCommonPowerMockRunner.java: 53) на орг.powermock.модули.junit4.PowerMockRunner.run(PowerMockRunner.java: 53) на орг.тесты JUnit.бегун.JUnitCore.run (JUnitCore.java: 160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.Ява:68) на com.intellij.РТ.исполнения.тесты JUnit.IdeaTestRunner$Repeater.startRunnerWithArgs (IdeaTestRunner.java: 47) на com.intellij.РТ.исполнения.тесты JUnit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java: 242) на com.intellij.РТ.исполнения.тесты JUnit.JUnitStarter.main (JUnitStarter.java: 70) Вызвано: java.ленг.NullPointerException at орг.решение Elasticsearch.Строить.(Строить.java: 47)... 41 более
процесс завершен с кодом выхода 255
Примечание:
исходный код фактических базовых классов elasticsearch можно найти здесь
и
1 ответов
при вызове с насмешками org.elasticsearch.Build#getElasticsearchCodebase
Build.class.getProtectionDomain().getCodeSource().getLocation()
возвращает null
потому что код не имеет местоположения (динамический метод, порожденный cglib.)
когда инициализации org.elasticsearch.Build
во время вашего макета кода с помощью
final URL url = getElasticsearchCodebase(); // url is null
final String urlStr = url.toString(); // null pointer exception.
конечно, макет не будет успеха и бросить ExceptionInInitializerError
что указывает на исключение, возникшее во время оценки статического инициализатора или инициализатора для статического переменная.
вы можете легко воспроизвести это исключение, используя следующий код:
@RunWith(PowerMockRunner.class)
@PrepareForTest({QueryBuilders.class})
public class MyQueryBuilderTest {
@Test
public void test() {
final Build current = Build.CURRENT;
}
}