java – 模拟一个类的问题

我试图用mockito模拟Queryjdbi,但它无法模拟其基类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技术上令人印象深刻).

希望有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?
Java菜单驱动程序以检查数字类型
使用Junit的Maven项目 - 检查银行账号
JAVA编程基础
在Java中使用throw、catch和instanceof来处理异常
在Java中,将数组分割为基于给定查询的子数组后,找到子数组的最大子数组和
如何在Java中从给定的字符串中删除HTML标签?
在PHP中,IntlChar getBlockCode()函数的翻译如下:
如何在Android中实现按下返回键再次退出的功能?
如何使用Java中的流式API解析JSON字符串?
Java中的模式类