代码之家  ›  专栏  ›  技术社区  ›  Vinoth Kumar C M

PowerMockito(带Mockito)因ExceptionInInitializerError失败

  •  15
  • Vinoth Kumar C M  · 技术社区  · 8 年前

    java.lang.ExceptionInInitializerError 每次都扔。

    你能帮我找出问题所在吗?

    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;
        }
    }
    

    使用Powermock runner进行Junit测试

    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语言lang.ExceptionInInitializerError位于 组织。elasticsearch。常见的登录中。弃用日志。(DeprecationLogger.java:138) 组织。elasticsearch。指数查询AbstractQueryBuilder。(AbstractQueryBuilder.java:53) 在 来源) Java语言郎。反思。构造函数。newInstance(Constructor.java:423)位于 组织。objenesis。实例化器。太阳太阳反射系数指示器。newInstance(SunReflectionFactoryInstallator.java:40) 在org。objenesis。ObjenesisBase。newInstance(ObjenesisBase.java:59)位于 在 组织。莫基托。内部的创造杰莫克。分类器。冒用(classimpositer.java:63) 在 在 组织。powermock。应用程序编程接口。莫基托。内部的模拟创建。MockCreator。mock(MockCreator.java:60) 在org。powermock。应用程序编程接口。莫基托。PowerMockito。mock(PowerMockito.java:143) 在 通用域名格式。斯巴达系统。斯特拉塔斯。搜索领域MyQueryBuilderTest。TestBoostSetRightly(MyQueryBuilderTest.java:22) 太阳反映DelegatingMethodAccessorImpl。调用(DelegatingMethodAccessorImpl.java:43) 组织。朱尼特。内部的跑步者。测试方法。调用(TestMethod.java:68) 在 组织。朱尼特。内部的跑步者。MethodRoadie 2美元。运行(MethodRoadie.java:88) 在 组织。朱尼特。内部的跑步者。MethodRoadie。runbeforesthentestthenauts(MethodRoadie.java:96) 组织。powermock。模块。junit4.internal。impl。PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner。executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 组织。powermock。模块。junit4.internal。impl。PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner。executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 在 在 组织。powermock。模块。junit4.internal。impl。PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner。RunbeforesthentesttheAfter(PowerMockJUnit44 RunnerDelegateImpl.java:282) 组织。朱尼特。内部的跑步者。MethodRoadie。运行测试(MethodRoadie.java:86) 在 在 在 组织。powermock。模块。junit4.internal。impl。PowerMockJUnit44RunnerDelegateImpl$1。运行(PowerMockJUnit44RunnerDelegateImpl.java:120) 组织。朱尼特。内部的跑步者。ClassRoadie。runUnprotected(ClassRoadie.java:33) 组织。朱尼特。内部的跑步者。ClassRoadie。runProtected(ClassRoadie.java:45) 在 组织。powermock。模块。junit4.common。内部的impl。JUnit4TestSuiteChunkerImpl。运行(JUnit4TestSuiteChunkerImpl.java:104) 组织。powermock。模块。junit4.common。内部的impl。AbstractCommonPowerMockRunner。运行(AbstractCommonPowerMockRunner.java:53) 在 组织。powermock。模块。junit4.PowerMockRunner。运行(PowerMockRunner.java:53) 通用域名格式。intellij。junit4.JUnit4IdeaTestRunner。startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 在 通用域名格式。intellij。rt.执行。朱尼特。IdeaTestRunner$中继器。startRunnerWithArgs(IdeaTestRunner.java:47) 在 在 通用域名格式。intellij。rt.执行。朱尼特。朱尼茨塔特。main(JUnitStarter.java:70) 组织。elasticsearch。建筑(Build.java:47)。。。41个以上

    进程已完成,退出代码为255

    https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/index/query/QueryBuilders.java

    https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/index/query/MultiMatchQueryBuilder.java

    1 回复  |  直到 8 年前
        1
  •  3
  •   aristotll    8 年前

    使用模拟呼叫时 org.elasticsearch.Build#getElasticsearchCodebase

    Build.class.getProtectionDomain().getCodeSource().getLocation()
    

    null

    那么什么时候 initializing 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;
        }
    
    }