gpt4 book ai didi

java - 模拟类(class)的问题

转载 作者:搜寻专家 更新时间:2023-10-31 20:13:36 25 4
gpt4 key购买 nike

我正在尝试模拟 Query带有 mockito 的 JDBI 类,但是它无法模拟其基类 SqlStatement 的方法。

当运行 when 语句下面的代码时,实际上是在调用基类中的具体实现,并因 NullPointerException 而失败。

import java.util.Map;

import org.junit.Test;
import org.skife.jdbi.v2.Query;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class TestClass {
@Test
public void testBind() {
Query<Map<String,Object>> mockQuery = mock(Query.class);
when(mockQuery.bind("xxx", 5)).thenReturn(mockQuery); //this line fails
//more stuff here
}
}

我也用 EasyMock 尝试过这个方法并得到了相同的结果,它无法模拟这个方法。

更多信息:

  • Mockito 版本为 1.9.5
  • JDBI 版本是 2.4.1(当前与 dropwizard 一起提供的版本)

异常(exception)情况是:

    java.lang.NullPointerException
at org.skife.jdbi.v2.SQLStatement.bind(SQLStatement.java:434)
at TestClass.testBind(TestClass.java:17)
at ....

有什么解决办法吗?

最佳答案

SqlStatement 中的

bind 方法是 final方法(例如 SQLStatement#bind(String, int) ),因此您不能使用 Mockito 模拟它们,这是 JVM 的限制(编辑:) mockito 目前无法绕过


EDIT2:请注意,正如下面的评论所指出的,对上面写的内容存在一些误解,这需要我的澄清:


您的选择是更改您的设计,这样您就不必对这些交互进行 stub ,或者您必须使用 PowerMock,它使用类加载器的复杂技巧来重写类字节码(这不是我的首选方法,尽管 PowerMock 在技术上令人印象深刻)。

希望对您有所帮助。

关于java - 模拟类(class)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com