如何模拟 DriverManager.getConnection(...)?

2023-11-26

我有一个类,它连接到 H2 数据库并运行多个 SQL 语句。

public class H2Persistence implements IPersistence {

    private Connection conn;

    @Override
    public void open() {
        try
        {
            Class.forName("org.h2.Driver");
            conn = DriverManager.getConnection(CONN_TYPE_USER_HOME);

            final Statement stmt = conn.createStatement();

            stmt.executeUpdate("CREATE TABLE PERSON(" +
                    "ID BIGINT,"+
                    "AGEGROUP VARCHAR(255),"+
                    "MONTHLY_INCOME_LEVEL VARCHAR(255)," +
                    "GENDER VARCHAR(1),"+
                    "HOUSEHOLD_ID BIGINT)");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
...
}

我想编写一个单元测试来验证open方法某个 SQL 语句(DROP TABLE IF EXISTS PERSON) 被执行。

为了做到这一点,我编写了以下测试:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(PowerMockRunner.class)
@PrepareForTest(DriverManager.class)
public class H2PersistenceTest {
    @Test
    public void testDropPersonIsCalled() throws SQLException {
        final Statement statement = mock(Statement.class);

        final Connection connection = mock(Connection.class);

        when(connection.createStatement()).thenReturn(statement);

        mockStatic(DriverManager.class);

        when(DriverManager.getConnection(H2Persistence.CONN_TYPE_USER_HOME)).thenReturn
                (connection);


        final H2Persistence objectUnderTest = new H2Persistence();

        objectUnderTest.open();
        verify(statement.executeUpdate("DROP TABLE IF EXISTS PERSON"));
    }
}

但它不起作用 - 而不是模拟连接,DriverManager返回真实连接。

我该如何修复它(使DriverManager在测试中返回连接模拟)?

这是pom.xml我的项目,也许有问题。

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ru.mycompany</groupId>
    <artifactId>myproduct</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <powermock.version>1.5.1</powermock.version>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.6</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-util</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-assert-core</artifactId>
            <version>2.0M8</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.173</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

这个有效(注意导入):

import static org.easymock.EasyMock.expect;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.easymock.PowerMock.mockStatic;
import static org.powermock.api.easymock.PowerMock.replay;


@RunWith(PowerMockRunner.class)
@PrepareForTest({DriverManager.class, H2Persistence.class})
public class H2PersistenceTest {
    @Test
    public void testDropPersonIsCalled() throws SQLException {
        final Statement statement = mock(Statement.class);

        final Connection connection = mock(Connection.class);

        when(connection.createStatement()).thenReturn(statement);

        mockStatic(DriverManager.class);

        expect(DriverManager.getConnection(H2Persistence.CONN_TYPE_USER_HOME))
                .andReturn(connection);
        expect(DriverManager.getConnection(null))
                .andReturn(null);

        replay(DriverManager.class);
        final H2Persistence objectUnderTest = new H2Persistence();

        objectUnderTest.open();

        verify(statement).executeUpdate("DROP TABLE IF EXISTS PERSON");
        verify(statement).executeUpdate(H2Persistence.CREATE_TABLE_PERSON);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模拟 DriverManager.getConnection(...)? 的相关文章

随机推荐

  • 如何重置 React 输入的默认值

    我有一组设置了 defaultValue 的 React 输入元素 这些值通过 onBlur 事件更新 我还在页面上执行了另一个操作 用于更新这些输入元素中的所有值 发生这种情况时 有没有办法强制做出反应以呈现新的默认值 我无法轻松使用 o
  • 在 Windows 中通过调用名称调用 Ghostscript?

    我应该怎么做才能在 Windows 中通过调用名称调用 Ghostscript 我将 Ghostscript bin 文件夹添加到 Windows PATH 和 Path 变量 但它不起作用 gswin32c exe 和 gswin32c
  • 在 qUnit 中测试整个页面重定向

    我有以下功能 var redirect function window location href http www google com 我想使用 qUnit 测试这个函数 问题是 当我调用运行测试的 HTML 文档时 一旦它到达调用的测
  • 为什么a[n]在运行时被c接受?

    为什么我们可以在c中做到这一点 int n scanf d n int a n 我认为数组在加载时位于内存中 但上面的示例似乎在运行时有效 我是否误解了什么 你们能帮忙吗 Thanks 我不是 C 方面的专家 但这可能是一个变长数组添加者为
  • 在 swift 中为 for 循环添加延迟

    我有一个编码 问题 我有一个标签 我想每 2 秒动态更改一次文本 我做了以下事情 WELCOME STRING ARRAY let welcomeContainer String Welcome Benvenuti Bienvenue Wi
  • 在asp.net mvc中,如何传递整数数组作为参数

    我有一个控制器函数 以前将整数作为 URL 中的每个部分 我在路由文件中设置 但现在其中一个参数需要是整数数组 这是控制器的操作 public JsonResult Refresh string scope int scopeId retu
  • 如何下载 Google App Engine 上的所有数据存储实体?

    我读了GAE 文档 我似乎不知道如何下载我的所有实体数据 我想做的是将整个内容下载为一个大 TSV 文件 或者我可以轻松地合并到其中的文件 这样我就可以将我的各种实体导入到电子表格中并摆弄它们 但我却被困在了起点 我不明白文档的前几位 本文
  • 如何在android中的imageview中从url网站获取图像

    我试图从 url 网站获取 ImageView 中的图像 但图像没有显示 这段代码有什么问题 这是网址image 这是我的主要活动 ImageView i private Bitmap bitmap Override protected v
  • 如何将 CryptoPP::Integer 转换为 char*

    我想将 myVar 转换为CryptoPP Integer to char 或字符串 代码如下 CryptoPP Integer myVar pubKey ApplyFunction m std cout lt lt result lt l
  • C“块”插入符

    我注意到了该声明涉及脱字号 字符固定在 cdecl org 网站的顶部 cast foo into block int long long returning double double int long long foo 有人可以解释一下
  • 在 Woocommerce 中以编程方式添加带有评级的产品评论

    标题说明了一切 我知道评论是 WordPress 中的原生评论帖子类型 我已经包含了添加评论的代码 但问题是我不清楚如何对评论进行评级以及如何将其与特定产品联系起来 当我使用 comment post ID 时 它似乎没有将评论 评论 分配
  • 无法在 Chromium 嵌入式框架中播放视频 (mp4)

    我正在使用 Windows 窗体应用程序和嵌入式 Chromium 嵌入式框架 CEF 除了视频和音频之外 一切都运行良好 我怎样才能让它发挥作用 提前致谢 您需要使用选项来编译 CEF 以启用proprietary codecs 即 H
  • CGFontCreateWithDataProvider 在飞行模式下挂起

    当我打电话给CGFontCreateWithDataProvider 当处于飞行模式时 我的应用程序冻结了 不在飞行模式下 它工作正常 字体存储在设备上 不应进行网络访问 调用该方法加载本地字体文件时 self registerIconFo
  • WordPress 混合内容错误

    我在多站点环境中有 3 个站点 我还为管理部分启用了 SSL 但我得到了很多 混合内容 管理员错误仅适用于ONE地点 结果 管理中的许多脚本和样式表都被破坏了 如果我的有什么问题ht访问规则 or the 可湿性粉剂配置文件 那么其他网站上
  • 如何检测我的程序是否在 Active Directory 环境中运行?

    如何检测我的程序是否在 Active Directory 环境中运行 我正在使用 C 和 Net 2 0 尝试获取Environment UserDomainName 并将其与Environment MachineName 进行比较 如果两
  • 我们可以使用phonegap框架在iphone中进行推送通知吗?

    我需要有关如何使用phonegap 框架实现推送通知的基本概念 我们可以 就在今天早上 该测试版的最新版本为开发人员提供了一个非常令人兴奋的新功能 新消息的推送通知 这意味着应用程序将能够在发生重要事件时发送短信样式的消息 摘自该网站 ht
  • 将变量名称向量传递给 dplyr 中的range()

    我想通过arrange dplyr 要排序的变量名称向量 通常我只是输入我想要的变量 但我试图创建一个函数 其中排序变量可以作为函数参数输入 df lt structure list var1 c 1L 2L 2L 3L 1L 1L 3L
  • Visual Studio 2012 数据库设计器 - 功能是否已更改?

    我最近安装了 Visual Studio 和 SQL Server 2012 我想知道我是否遗漏了一些东西 因为数据库设计器似乎不像旧版本那么友好 在 Visual Studio 2010 中 当我在 App Data 目录中创建 SQL
  • 无法将文件从捆绑包复制到 iOS 中的文档目录

    我正在尝试使用以下代码将文件从我的包复制到 iOS 中的文档目录 let bundlePath NSBundle mainBundle pathForResource information ofType png print bundleP
  • 如何模拟 DriverManager.getConnection(...)?

    我有一个类 它连接到 H2 数据库并运行多个 SQL 语句 public class H2Persistence implements IPersistence private Connection conn Override public