加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 模拟一个类的问题

发布时间:2020-12-14 19:23:24 所属栏目:Java 来源:网络整理
导读:我试图用mockito模拟Query类JDBI,但它无法模拟其基类SqlStatement的方法. 当运行下面的代码时,when语句实际上是在基类中调用具体实现,并且失败并出现NullPointerException. import java.util.Map;import org.junit.Test;import org.skife.jdbi.v2.Query;impo

我试图用mockito模拟Query类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

我也尝试过使用EasyMock并获得相同的结果,它无法模拟这种方法.

更多信息:

> Mockito版本是1.9.5
> JDBI版本是2.4.1(目前附带dropwizard的版本)

例外是:

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

任何想法如何解决这个问题?

最佳答案
SqlStatement中的绑定方法是最终的(例如SQLStatement#bind(String,int)),所以你不能使用Mockito来模拟它们,这是对模拟者目前无法绕过的JVM(编辑:)的限制.

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

> JVM的限制意味着您无法加载标记有最终访问权限的类型的子类,您不能覆盖标记为最终访问权限的方法,否则您将获得VerifyError. §8.1.1.2 final classes of the Java Language Specification §8.4.3.3 final methods of the JLS §4.10 of the Java Virtual Machine Specification
> mockito无法绕过意味着Mockito目前无法克服最终类或最终方法来嘲笑它们,因为当时Mockito使用CGLIB生成要模拟的类型的子类.但是其他框架(如PowerMock或JMockit)可能能够做到这一点,因为他们有其他策略来克服这个问题.

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

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读