一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句

ThinkPHP与Laravel双框架开发小区物业管理系统实践 B/S架构作为现代Web应用的主流模式,通过浏览器即可访问服务,显著降低了系统部署和维护成本。其核心技术原理基于HTTP协议和前后端分离思想,特别适合物业管理这类需要多端访问的场景。在PHP生态中,ThinkPHP以其高效开发特性著称,而Laravel则提供了更完善的现代化开发体验。通过RBAC权限控制和ORM数据操作等关键技术,实现了业主管理、物业收费等核心模块。本项目创新性地采用双框架架构,既发挥了ThinkPHP在后台管理中的快速开发优势,又利用了Laravel在API构建方面的强大功能,为社区数字化 阅读详情

一个通用的单元测试框架的思考和设计01-思考篇

一个通用的单元测试框架的思考和设计02-设计篇

一个通用的单元测试框架的思考和设计03-实现篇-核心类源码

一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据

一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入

一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束

一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值

有时候,仅仅依靠框架提供的xml方式来插入和删除数据时不够的,有的时候需要在测试代码中执行一些sql语句,以下是介绍如何便捷的做到这一点

前几章节我们介绍过了,我们是靠dbuint来进行测试数据的维护的,而dbunit给我们提供了一个非常好的接口IDatabaseTester,这个接口中定义了一些与数据库连接相关的操作,在我们的框架中也是用这种方式来维护数据库连接的。

1.定义一个接口

public interface IDatabaseTesterAware {
	/**
	 * 设置Tester对象
	 * @param databaseTester
	 * @see org.dbunit.IDatabaseTester
	 */
	public void setIDatabaseTester(IDatabaseTester databaseTester);
}
2.在我们的testCase类中实现该接口-一般在basetestcase中实现,具体的测试类直接可以使用了

@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseHopTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
	protected IDatabaseTester databaseTester;
	@Override
	public void setIDatabaseTester(IDatabaseTester databaseTester) {
		this.databaseTester = databaseTester;
	}
}
3.在框架中将IDatabaseTester注入

找到我们框架里的DatasetProviderListener 的prepareTestInstance方法,在该方法的最后

		//将测试IDatabaseTester注入到测试类中
		if(testInstance instanceof IDatabaseTesterAware){//在这里为testcase中的IDatabaseTester赋值
			IDatabaseTesterAware databaseTesterAware = (IDatabaseTesterAware)testInstance;
			databaseTesterAware.setIDatabaseTester(databaseTester);
		}

这样我们的基类testcase中就可以定义常用到的方法了,如下

@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
    protected IDatabaseTester databaseTester;
    @Override
    public void setIDatabaseTester(IDatabaseTester databaseTester) {
        this.databaseTester = databaseTester;
    }
    /**
     * 利用dbunit的connection执行sql语句
     * @param sql
     */
    protected void executeSQL(String sql){
        Connection connection = null;
        Statement statement = null;
        try {
            connection = databaseTester.getConnection().getConnection();
            statement = connection.createStatement();
            statement.execute(sql);
        }catch (Exception e) {
            ReflectionUtils.handleReflectionException(e);
        }finally{
            closeStatement(statement);
            closeConnection(connection);
        }
    }
    /**
     * 关闭数据库连接
     * @param connection
     */
    protected void closeConnection(Connection connection) {
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                ReflectionUtils.handleReflectionException(e);
            }
        }
    }
    /**
     * 关闭sql语句对象
     * @param statement
     */
    protected void closeStatement(Statement statement){
        if(statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                ReflectionUtils.handleReflectionException(e);
            }
        }
    }
    
    /**
     * 生成默认的刷新物化视图的sql语句--仅限于oracle
     * @param materializedViewName 物化视图的名字
     * @return
     */
    protected String generateRefeshMaterializedViewSql(String materializedViewName){
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("BEGIN")
          .append("  DBMS_SNAPSHOT.REFRESH")
          .append("  (LIST                 => '")
          .append(materializedViewName).append("'")
          .append("  ,PUSH_DEFERRED_RPC    => TRUE")
          .append("  ,REFRESH_AFTER_ERRORS => FALSE")
          .append("  ,PURGE_OPTION         => 1")
          .append("  ,PARALLELISM          => 0")
          .append("  ,ATOMIC_REFRESH       => TRUE")
          .append("  ,NESTED               => FALSE);")
          .append("  END;");
        return stringBuffer.toString();
    }
    
    /**
     * 刷新指定的物化视图
     * @param materializedViewName 物化视图名字
     */
    protected void refeshMaterializedView(String materializedViewName){
        executeSQL(generateRefeshMaterializedViewSql(materializedViewName));
    }
}

其中有一个重要的功能就是刷新物化视图的功能


Claude Code实战:CLI+CLAUDE.md契约化AI编程工作流 CLAUDE.md是一种结构化需求契约文件,结合CLI命令行接口,将模糊的人类意图转化为机器可执行、可验证、可审计的AI协作指令。其核心原理是通过YAML元数据、自然语言目标、技术约束与自动化验收标准四层建模,实现需求对齐、评审闭环与知识沉淀。该模式不依赖图形界面,天然适配Git、CI/CD与终端工程流,显著降低跨角色沟通成本。适用于已熟悉git、shell与配置文件的中阶开发者及技术负责人,尤其适合金融、政务等强审计要求场景。本文详解CLAUDE.md规范设计、config.yaml分工逻辑与终端环境避坑 阅读详情

相关推荐

多维聚合与滚动计算:金融场景下的生产级数据操作实战

多维聚合是数据分析的基础能力,指在多个业务维度(如地区、产品、客户等级)上对数值指标进行分组统计;其核心原理在于构建结构化分组键并应用语义匹配的聚合函数,技术价值体现在支撑实时风控、经营分析和监管报送等关键系统;典型应用场景包括银行客户分层、电商销售矩阵生成、支付交易波动监测等;而滚动计算作为时间维度上的延伸操作,需结合业务周期(如交易日历、财年)进行窗口对齐与缺失值治理;本文聚焦金融行业真实落地经验,深入解析pandas中groupby、rolling、pivot_table等核心操作的工程化实践,并强调

a5199519的博客 374

Spring 单元测试中使用@Sql准备数据

在写单元测试时,往往需要在数据库中准备对应的测试数据。 我们可以在测试用例中,通过代码的方式往数据库中插入数据。但这么做会使测试代码比较臃肿。 个人觉得,通过sql脚本去导入数据,再结合@Transactional注解对数据进行回滚,是一种更好的方案。 为此,spring为我们准备了很有用的注解@Sql。 @Sql @Sql注解可以执行SQL脚本,也可以执行SQL语句。它既可以加上类上面,也可以加在方法上面。 默认情况下,方法上的@Sql注解会覆盖类上的@Sql注解,但可以通过@SqlMergeMode注解

xgw的专栏 7358

Rarity Simulator Part 2:游戏与NFT概率模拟工具详解

概率模拟是计算机科学中重要的随机过程建模技术,其核心原理是通过大量随机抽样来验证概率分布的理论预期。在游戏开发、NFT生成等场景中,概率系统直接影响用户体验和系统平衡性。Rarity Simulator Part 2作为专业的稀有度模拟工具,支持自定义概率参数和批量任务处理,能够有效验证装备掉落率、抽卡概率等关键指标。该工具通过RESTful API和可视化分析,为开发者提供从基础概率测试到大规模并发模拟的全套解决方案,特别适合需要高精度概率验证的游戏平衡测试和NFT稀有度分布设计。

weixin_34268169的博客 453

用DbUnit进行数据库集成测试 (Setup, Teardown)

DbUnit是测试数据库的利器,不过要想弄明白还是需要一番研究。好在它的源代码不多,文档也还算全。我就在此做一个总结吧。 DbUnit.NET是DbUnit的.NET版,不过只推出了alpha版,而且自从06年以后就不再更新了。Stack Overflow上有一个帖子,提出了一些替代方案。 现在的DbUnit要求在测试时继承DBTestCase,而不是之前的DatabaseTestCase...

yukang116的博客 862

Kafka Connect SMT数据塑形实战:语义清洗、结构扁平与契约治理

Kafka Connect的Simple Message Transform(SMT)是实现流式数据轻量级治理的核心能力,其本质是在消息流转链路最前端完成字段语义统一、嵌套结构扁平化与Schema演进兜底。相比Flink或KSQL后置处理,SMT以零GC开销、低延迟和强确定性保障数据‘可读、可验、可追溯’,支撑金融级数据管道的合规性与可观测性要求。本文聚焦data shaping与schema evolution两大高频技术诉求,详解ReplaceField、Flatten、InsertField等关键SM

dianan0938的博客 447

大厂Python自动化测试面试题合集

题目:函数的作用是什么?调用函数的语法?答案:将独立功能代码封装成模块,复用代码;函数名(实参)。题目:函数 return 作用是什么?无 return 时函数返回什么?多返回值底层是什么类型?答案:返回函数执行结果;无 return 默认返回 None;return x,y,z 底层自动封装为元组。题目:函数四大参数类型分别是什么?定义顺序要求?答案:必选参数、默认参数、可变位置 * args、命名关键字、可变关键字 **kwargs;顺序:必选→默认→*args→命名关键字→**kwargs。

悦分享 104

DBUnit测试详解

11月7日 Spring+iBatis+DBUnit测试详解 在很多成功的软件项目中,测试自动化往往是关键的层面。DBUnit允许开发人员在测试之前给目标数据库植入测试数据,在测试完毕后,再将数据库恢复到测试前的状态。在最近的一个项目中,我尝试使用用DBUnit对Spring+iBatis的架构进行测试,下面记录了DBUnit的使用过程和遇到的一些问题。 测试环境 首先,我...

zscomehuyue的专栏 576

IMU标定中的Allen方差

Allen方差 Allen方差是IMU标定任务中的常用工具。IMU标定可以分为确定性误差和随机误差,确定性误差包括:scale、bias、misalignment。随机误差则主要是高斯白噪声和bias随机游走。Allen方差主要用于标定随机误差。 Allen方差获取 Allen方差的计算方法如下: 保持IMU静止, 采集N个数据点。 将N个点定长分组,常用的交叠式Allen方差如下(n=3): 对于每个子集,计算均值后,计算相邻两组的方差,得到的时间-方差曲线即为Allen方差。 Alle

realjc的博客 5733

DBunit入门

<br /> 使用DBTestCase子类设置数据库<br />第1步:创建你的数据集文件<br /><br />你的测试需要一些数据来辅助。也就是说你必须创建一个数据集。在大多数情况下你会使用XML数据集。你可以手动从头创建一个flat XML数据集或从你的数据库中导出一些数据。第2步:扩展类的DBTestCase<br />现在您需要创建一个测试类。最简单的使用DBUnit的方法是是你的测试类继承DBTestCase。DBTestCase扩展了JUnit TestCase类。一个getDataSet()

BoBo的代码世界 3524

海量数据 / Vastbase 深度研究笔记 v3.1

v3.1 重点修订:在 v3.0 审慎版基础上,新增“2026 新变量”章节,纳入 7 亿级定增、HTAP / 多模态时序数据库、G100 V3.0 Build 8 的 3CM+2DN 高可用补强、pgvector / V100 / AI 多模叙事,以及集成服务基因与标准软件 ARR 的拉扯。核心关注点是:Vastbase 能否把 openGauss 生态红利、数据库产品矩阵和行业交付能力,转化为可持续、可复购、低边际成本的标准软件收入。海量不是没有业务基本盘,也不是马上失血致死;客户越多,服务债越大。

喝醉酒的小白 544

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

本地优先的个人财务助理:用Python和SQLite打造离线记账工具

本地优先(Local-First)是一种数据默认存储在自己设备上的设计理念,它强调数据所有权、离线可用性和完全可控性。与依赖云端的在线记账App不同,本地工具将数据保存在单文件SQLite数据库中,用户自行管理备份与安全。SQLite作为嵌入式数据库,无需独立服务,配合Python标准库即可快速构建增删改查与聚合统计能力,非常适合数据敏感型用户和追求自动化脚本的开发者。这种方案既适用于个人每日记账、分类预算和月度复盘,也能作为开发者学习数据库建模与CLI工具设计的实践项目。本文基于Python与SQLite

weixin_34128839的博客 443

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

【用 Vibe Coding 实现的 C++17 在线判题系统】项目准备 + 后端开发

本文介绍了基于Vibe Coding方法搭建仿LeetCode的OJ平台项目准备过程。首先在Gitee创建项目仓库,通过AI引导的深度访谈梳理需求并生成SPEC.md文档。随后根据文档安装必要依赖项,包括构建工具、C++库、MySQL数据库等。项目采用C++后端(cpp-httplib)和原生前端技术栈,最终按照SPEC文档构建了完整的项目目录结构。整个过程展示了如何使用AI辅助进行项目规划和初始化工作。

无限进步!!! 420

Icarus Verilog和GTKwave使用简析

本简要介绍Icarus Verilog和GTKwave的使用,使用iverilog(Icarus Verilog)编译仿真verilog而使用GTKWave查看仿真数据波形下载安装 基本使用 iverilog使用 GTKWave使用 iverilog常用选项 使用库 注意

husipeng86的专栏 1万+

XGBoost调参新姿势:Bayesian优化实战指南(附完整代码)

本文详细介绍了如何使用Bayesian优化方法高效调优XGBoost模型参数。通过解析Bayesian优化核心原理和XGBoost关键参数,提供完整的实战代码示例,帮助读者掌握这一智能调参技术,显著提升模型性能。文章特别适合机器学习工程师和数据科学家阅读。

weixin_42536058的博客 366

Uber Maven构建测试实战:从Maven环境搭建到Spark项目CI门禁

Maven构建工具作为JVM生态的标准化管理方案,其“约定优于配置”的核心原理为项目编译、测试、打包提供了统一范式。在大型工程体系中,构建测试不仅是简单执行命令,更涉及依赖收敛、增量编译、产物校验与测试门禁等工程实践。Uber基于Apache Maven定制了内部构建体系,通过BOM统一版本、分布式构建与严格质量检查,保障交付结果的可靠性。在Spark数据工程场景中,Maven构建测试需重点关注依赖作用域与测试JVM参数,避免运行时冲突与资源溢出。本文以Spectro Spark项目为实例,从环境配置、生命

weixin_34008805的博客 572

从零搭建Arduino仿真开发环境:SimulIDE与IDE配置全攻略

本文详细介绍了如何从零搭建Arduino仿真开发环境,涵盖SimulIDE与Arduino IDE的配置全流程。通过仿真模拟环境,开发者可以零成本试错,快速验证电路设计和程序逻辑,特别适合初学者和便携开发需求。文章提供了软件安装、环境配置、项目实战及问题排查的完整指南,帮助读者高效掌握Arduino仿真开发技巧。

weixin_29284657的博客 518

GPT-6 Astra vs GPT-5.6 Sol:工程师实战决策指南

大型语言模型在软件开发中的应用已从代码补全迈向工作流重构。百万上下文不再仅是容量指标,而是语义记忆与动态索引能力的体现;vibe coding则标志着AI从被动响应转向意图理解、执行验证与自主迭代的闭环构建。其技术价值在于提升需求拆解准确率、降低跨服务依赖理解成本,并支撑多语言、高合规、实时协作等复杂工程场景。当前主流选型聚焦于GPT-6 Astra与GPT-5.6 Sol的协同演进——前者适合标准化CRUD、算法工程与前端组件生成,后者仍在遗留系统维护、安全敏感编码等确定性场景保持不可替代性。本文基于真实

weixin_34392435的博客 290

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3316

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python编程实战:查找重复数、登录功能与位运算详解

在编程开发中,数据处理和算法优化是核心技能。哈希表作为一种高效的数据结构,能够实现O(1)时间复杂度的查找操作,广泛应用于重复数据检测、缓存实现等场景。位运算则是计算机底层的基础操作,通过直接操作二进制位实现高效计算,在权限控制、加密算法等场景中发挥重要作用。本文通过Python实例,详细讲解了使用哈希表查找重复数的三种方法,分析了不同算法的时间与空间复杂度;同时展示了Web开发中登录功能的完整实现,包括密码安全存储、会话管理等关键技术点;最后深入解析了位运算的原理与应用,帮助开发者掌握这些基础但强大的编程

weixin_30983353的博客 281

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python自动化Excel办公:从入门到实战

Excel数据处理是办公自动化的核心场景,Python凭借其强大的数据处理能力成为自动化办公的首选工具。通过openpyxl、pandas等库,开发者可以实现Excel文件的读写、格式设置、公式计算等操作,处理百万行数据也不在话下。这种技术组合特别适合财务对账、销售报表生成等重复性工作场景,能提升10倍以上的工作效率。本文以Python自动化处理Excel为核心,详细讲解环境搭建、基础操作到高级应用的全流程,包含多文件合并、数据校验等实战案例,帮助开发者快速掌握这一提升生产力的关键技术。

477

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

正则表达式现代实战:从数据清洗到语义建模

正则表达式是文本处理的基础技术,其核心原理基于有限状态机(FSM),具备高效匹配、低内存开销和跨平台兼容性等技术价值。在数据清洗、日志解析、合规脱敏、UGC内容治理等典型场景中,正则承担着非结构化文本标准化的关键角色。然而,传统教学忽视了Unicode支持、零宽断言优化、命名捕获建模与编译缓存等现代工程实践要点。本文聚焦‘业务语义驱动的正则设计’与‘可维护正则系统构建’两大主线,结合真实电商日志清洗与保险OCR后处理案例,揭示如何用`regex`库突破Python原生`re`的Unicode限制,并通过命名

weixin_30820077的博客 361

玩转 ReflectionUtils 工具类,离大佬又近一步

ReflectionUtils是Spring框架中的反射工具类,它提供了一系列静态方法,可以方便地进行类、对象、方法、字段等反射操作。shallowCopyFieldState(final Object src, final Object dest)将源对象的属性值浅拷贝到目标对象中。该方法会遍历源对象的所有可读属性,并将其值拷贝到目标对象的对应属性中。拷贝的方式是通过直接赋值来实现的,因此是浅拷...

566
上一篇: 解决maven打包编译出现File encoding has not been set问题
下一篇: jndi配置-各种服务器
CrazyCoder2010
博客等级 码龄16年 298粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值