当前位置: 首页 > 知识库问答 >
问题:

PowerMockito(with Mockito)因ExceptionInInitializerError而失败

范成周
2023-03-14

我们正在使用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;
    }
}

使用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);
    }
}

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

注:

实际底层elasticsearch类的源代码可以在这里找到

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个答案

何晗昱
2023-03-14

使用模拟调用时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.

当然,模拟将不会成功,并抛出ExceptionInitializerError,这表示在计算静态初始值设定项或静态变量的初始值设定项期间发生了异常。

您可以使用以下代码轻松地再现此异常:

@RunWith(PowerMockRunner.class)
@PrepareForTest({QueryBuilders.class})
public class MyQueryBuilderTest {

    @Test
    public void test() {
        final Build current = Build.CURRENT;
    }

}
 类似资料:
  • 我想在我的流量管道中使用,以绕过过滤。 这是我所拥有的: 这是对此的输入: 我可以在没有失败,我甚至可以访问映射,但是当第一次迭代完成时,我得到: 用户断开连接。 所以我的问题是,我是否正确使用了它,这里会有什么问题? 编辑: 我曾尝试当我使用value out of it时: 并将设置为订阅端的上下文,当我需要上游的信号时,只需更改此变量引用中的值,但它根本不会更改: 至少重复不会断开连接,但我

  • 我正在处理一些奇怪的错误信息,我认为这可以归结为内存问题,但我很难确定它,可以从专家那里得到一些指导。 我有一个两台机器的Spark(1.0.1)集群。两台机器都有8个核心;一台有16GB内存,另一台有32GB内存(这是主)。我的应用程序涉及计算图像中的成对像素亲和力,尽管我测试的图像到目前为止只有1920x1200大,16x16小。 我确实必须改变一些内存和并行性设置,否则我会得到显式的OutO

  • 我的Ajax调用没有执行web方法,正在返回状态代码“302找到”。检查跟踪表明,该方法实际上是作为“选项”发送的?? 当web方法在aspx文件中时,这一切都在工作。当我把代码转换成UserControl时,我不得不把它移动到asmx。 Ajax调用: PLService中的Web方法 请求: 主持人:坦普里。org用户代理:Mozilla/5.0(Windows NT 6.1;WOW64;rv

  • 我试图对我的骆驼路由进行单元测试,在成功调用路由后,我从测试代码中获得了404,这意味着我无法从测试中读取响应,总是抛出没有找到404 这是我的测试代码 我的路线定义如下 所以我的路由被调用,日志输入器记录了有效负载的200成功,但是当生产者模板返回时,它有404异常。 知道我做错了什么吗?

  • 问题内容: 我重置了本地flask环境,但是没有通过捕获它的依赖项,pip freeze然后再将其删除。因此,我不得不重新安装整个堆栈的最新版本。 现在,我突然无法使用表单进行验证了。Flask声称CSRF将丢失。 第一次发送Get邮件时,我按预期检索了一个空邮件。现在,我填写表格并提交并form.errors显示: 真奇怪 我想知道Flask-WTF是否已更改,并且使用错误。 我可以清楚地看到存

  • 问题内容: 我正在尝试在Hadoop上执行map reduce程序。 当我将工作提交到hadoop单节点集群时。正在创建作业,但消息失败 “被ApplicationMaster杀死的容器” 使用的输入大小为10 MB。 当我使用输入文件400 KB的相同脚本时,它成功了。但是输入大小为10 MB的输入文件失败。 在我的终端中显示的完整日志如下。 我的映射器在这里触发另一个程序,该程序将在这里处理我