当前位置: 首页 > news >正文

5-【JavaWeb】JUnit 单元测试及JUL 日志系统

1. 使用 JUnit 进行单元测试

JUnit 是 Java 中非常流行的单元测试框架,MyBatis 与 JUnit 可以很好地结合,来测试持久层代码的正确性。

1.1 添加 JUnit 依赖

在使用 JUnit 之前,需要在 pom.xml 中引入 JUnit 依赖。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

1.2 单元测试基本结构

假设我们要测试 UserMapper 中的 getUserById 方法,测试代码如下:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;public class UserMapperTest {private SqlSessionFactory sqlSessionFactory;// 在测试开始前初始化 SqlSessionFactory@Beforepublic void setup() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}// 测试获取用户的方法@Testpublic void testGetUserById() {try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1);// 断言用户不为空Assert.assertNotNull("用户不存在", user);// 断言用户名是否正确Assert.assertEquals("用户名不匹配", "Alice", user.getName());}}
}

1.3 运行测试

  • 每个 @Test 注解的方法代表一个测试用例。
  • 使用 @Before 注解的方法会在每个测试方法执行前运行,常用于初始化。
  • 使用 Assert 方法来验证测试结果,例如 Assert.assertNotNull() 检查对象是否为空,Assert.assertEquals() 检查预期结果是否与实际结果一致。

通过运行 JUnit 测试,你可以快速验证 MyBatis Mapper 的 SQL 执行是否正确。


2. 使用 JUL(Java Util Logging)日志系统

Java Util Logging (JUL) 是 Java 内置的日志系统。MyBatis 默认使用 JUL 作为日志输出工具,你可以通过配置来控制日志输出级别与格式。

2.1 配置 MyBatis 日志级别

MyBatis 可以输出执行的 SQL 语句、参数及结果等信息。首先,你需要在 mybatis-config.xml 中配置日志级别。

<configuration><settings><!-- 开启日志输出 --><setting name="logImpl" value="JUL"/></settings>
</configuration>
  • logImpl 属性指定日志实现,这里设置为 JUL,表示使用 Java 自带的日志系统。

2.2 配置日志属性文件

在项目的 resources 目录下创建 logging.properties 文件,配置日志输出格式和级别。

logging.properties 示例:

handlers= java.util.logging.ConsoleHandler# 设置根日志级别
.level= INFO# 控制台日志级别和格式
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# MyBatis 日志级别
org.apache.ibatis.level = FINE
  • .level:设置根日志的默认级别,这里设为 INFO,表示输出普通信息及更高级别的日志。
  • org.apache.ibatis.level:将 MyBatis 的日志级别设置为 FINE,输出更详细的 SQL 日志。

2.3 常见日志级别

  • SEVERE:严重错误,可能导致程序崩溃的错误。
  • WARNING:警告信息,潜在问题。
  • INFO:普通信息,程序正常运行的相关消息。
  • CONFIG:配置信息,程序初始化时的信息。
  • FINEFINERFINEST:调试信息,显示程序细节,日志级别递增。

2.4 运行时日志输出

通过上面的配置,当你运行 MyBatis 程序时,日志会输出到控制台,并显示执行的 SQL 语句以及执行时间等。

示例日志输出:

INFO: PooledDataSource forcefully closed/removed all connections.
FINE: ==>  Preparing: SELECT * FROM users WHERE id = ? 
FINE: ==> Parameters: 1(Integer)
FINE: <==      Total: 1

日志中会显示 SQL 语句的准备状态、绑定的参数以及查询返回的记录数。

3. 使用 Properties 配置文件

Properties 文件是 Java 项目中常用的配置文件格式,用于配置一些可调整的参数,如数据库连接信息、日志级别等。在 MyBatis 中,properties 文件也可以用于配置日志系统。

3.1 配置文件示例

创建一个名为 application.properties 的文件,内容如下:

# 数据库配置
db.url=jdbc:mysql://localhost:3306/mydb
db.username=root
db.password=123456# 日志配置
log.level=INFO

然后在 Java 代码中加载这个配置文件:

import java.io.InputStream;
import java.util.Properties;public class ConfigLoader {public static Properties loadProperties(String fileName) {Properties properties = new Properties();try (InputStream input = ConfigLoader.class.getClassLoader().getResourceAsStream(fileName)) {properties.load(input);} catch (Exception e) {e.printStackTrace();}return properties;}
}

通过 loadProperties 方法可以将配置文件加载到内存中,在程序中使用时可以动态获取这些配置。


4. 编写日志配置文件

为了使用 Java 内置的日志系统 JUL,你可以编写一个 logging.properties 文件,配置日志的输出格式、级别、输出位置等。这个配置文件通常放在 resources 目录下。

4.1 logging.properties 文件内容示例:

# 使用 ConsoleHandler 输出日志到控制台
handlers = java.util.logging.ConsoleHandler# 全局日志级别
.level = INFO# 控制台日志处理器的级别和格式
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# MyBatis 日志配置
org.apache.ibatis.level = FINE
  • handlers:定义日志输出的处理器,这里我们使用 ConsoleHandler 将日志输出到控制台。
  • .level:定义默认的日志级别,INFO 表示输出一般信息。
  • org.apache.ibatis.level:为 MyBatis 特定包设置日志级别为 FINE,显示更详细的 SQL 执行信息。

4.2 使用 logging.properties

在应用启动时,你需要将 logging.properties 文件加载到日志系统中。可以通过以下方式加载:

import java.util.logging.LogManager;public class LogConfig {static {try {LogManager.getLogManager().readConfiguration(LogConfig.class.getClassLoader().getResourceAsStream("logging.properties"));} catch (Exception e) {e.printStackTrace();}}
}

将此类放置在应用启动类中,它会自动读取日志配置文件。


5. 使用 Lombok 快速开启日志

Lombok 提供了一些注解来自动生成日志记录器,从而简化日志功能的使用。在 MyBatis 项目中,可以使用 Lombok 提供的注解快速开启日志记录。

5.1 添加 Lombok 依赖

pom.xml 文件中添加 Lombok 依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope>
</dependency>

5.2 使用 Lombok 的日志注解

Lombok 提供了多种日志注解,常用的有:

  • @Slf4j: 使用 SLF4J 日志框架
  • @Log: 使用 JUL 日志框架
  • @Log4j: 使用 Log4j 日志框架

在这里,我们使用 @Log 注解来使用 Java 自带的 JUL 日志系统:

import lombok.extern.java.Log;@Log
public class MyService {public void performAction() {log.info("Performing some action...");}
}
  • @Log 自动生成了一个 log 对象,你可以直接使用 log.info()log.warning() 等方法记录日志。
  • 这样做的好处是,不需要手动创建日志记录器对象,Lombok 会自动帮你生成。

6. MyBatis 日志系统

MyBatis 提供了内置的日志系统,可以输出 SQL 语句的执行情况、参数绑定、返回结果等信息。MyBatis 支持多种日志框架,如 JUL、Log4j、SLF4J 等。你可以根据项目需要选择合适的日志框架。

6.1 配置 MyBatis 日志系统

MyBatis 默认支持多种日志实现方式,你可以通过 mybatis-config.xml 文件指定使用哪种日志系统。

<configuration><settings><!-- 配置 MyBatis 使用 JUL 作为日志框架 --><setting name="logImpl" value="JUL"/></settings>
</configuration>

6.2 查看 SQL 日志

在启用了 MyBatis 日志系统后,每当执行 SQL 语句时,控制台上会输出相关的日志信息。示例日志输出如下:

FINE: ==>  Preparing: SELECT * FROM users WHERE id = ? 
FINE: ==> Parameters: 1(Integer)
FINE: <==      Total: 1
  • Preparing:显示即将执行的 SQL 语句。
  • Parameters:显示 SQL 语句的参数绑定信息。
  • Total:显示查询返回的结果数。

6.3 使用 Log4j 或 SLF4J 作为日志系统

MyBatis 也支持其他日志系统,比如 Log4j 或 SLF4J。如果你想使用 Log4j,首先需要添加依赖:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

然后修改 mybatis-config.xml 配置文件,设置 logImplLOG4J

<configuration><settings><!-- 使用 Log4j 作为日志系统 --><setting name="logImpl" value="LOG4J"/></settings>
</configuration>

总结

  • JUnit 单元测试:通过 JUnit 进行单元测试可以确保 MyBatis 的持久层代码正常工作,@Before@Test 是最常用的注解,Assert 方法用于验证测试结果。
  • JUL 日志系统:MyBatis 支持 Java 自带的日志系统 (JUL),你可以通过 logging.properties 文件配置日志的级别、格式和输出位置。
  • Properties 文件:可以通过 application.properties 文件配置数据库连接信息和日志级别,并通过 Java 代码加载这些配置。
  • 日志配置文件logging.properties 文件用于配置 JUL 日志系统,可以控制日志的输出级别、格式等。
  • Lombok 日志注解:使用 Lombok 的 @Log@Slf4j 等注解可以快速开启日志功能,简化日志代码的书写。
  • MyBatis 日志系统:MyBatis 支持多种日志框架,通过 mybatis-config.xml 可以指定日志实现,MyBatis 的日志系统会输出 SQL 的执行情况,方便调试。

相关文章:

5-【JavaWeb】JUnit 单元测试及JUL 日志系统

1. 使用 JUnit 进行单元测试 JUnit 是 Java 中非常流行的单元测试框架&#xff0c;MyBatis 与 JUnit 可以很好地结合&#xff0c;来测试持久层代码的正确性。 1.1 添加 JUnit 依赖 在使用 JUnit 之前&#xff0c;需要在 pom.xml 中引入 JUnit 依赖。 <dependency><…...

多人开发小程序设置体验版的痛点

抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…...

【Kubernetes】常见面试题汇总(七)

目录 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; 21.简述 Kubernetes 中 Pod 的重启策略&#xff1f; 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; Kubernetes 中创建一个 Pod 涉及多个组件之间联动&#xff0c;主要流程如下&#xff1a; &#…...

EmguCV学习笔记 C# 11.1 DnnInvoke类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...

论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击阅读原文观看作者直播讲解回放&#xff01; 作者简介 孙洲浩&#xff0c;哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型&#xff08;LLMs&#xff09;展现出了非常强大的能力&#xff0c;但它们仍然…...

xLSTM模型学习笔记

笔记来源&#xff1a;bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制&#xff0c;其实就是一种时序上的注意力机制&#xff0c;相当于把不同时间进行"掺和"&#xff0c;是对时序信息的一种选择性控制…...

woocommerce 调用当前product_tag 为标题

要在 WooCommerce 中调用当前产品标签&#xff08;product tag&#xff09;作为标题&#xff0c;你可以使用以下代码。这段代码将获取当前产品标签的名称&#xff0c;并将其显示为标题。 <?php // 获取当前产品标签名称 $current_tag single_term_title(, false);// 检查是…...

音视频开发:基于sdl的pcm播放器

源码 /*** SDL2播放PCM*** 本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图* API&#xff08;Direct3D&#xff0c;OpenGL&#xff09;的封装&#xff0c;使用起来明显简单于直接调用底层* API。* 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2** 函数调…...

[产品管理-6]:NPDP新产品开发 - 4 - 战略 - 创新支持战略,支持组织的总体创新战略(平台战略、技术战略、营销战略、知识产权战略、能力建设战略)

目录 一、创新支持战略概述 二、平台战略&#xff1a;大平台小产品战略 2.1 概述 1、平台战略的定义 2、平台战略的特点 3、平台战略的应用领域 4、平台战略的成功案例 5、平台战略的发展趋势 2.2 大平台小产品战略 1&#xff09;大平台的建设 2&#xff09;、小产品…...

Cursor:程序员的AI助手,开启智能编程新时代

在当今快节奏的软件开发世界&#xff0c;效率和准确性是成功的关键。而 Cursor&#xff0c;作为一款创新的人工智能编程工具&#xff0c;正在极大地改变着编程的面貌&#xff0c;为开发者带来前所未有的便捷与惊喜。 智能代码生成 Cursor 利用强大的人工智能模型&#xff0c;…...

OpenAI 刚刚发布了新的Sora视频——实现的真人效果令人惊叹

在 YouTube 上发布了两段由专业创作者制作的新的“Sora Showcase”视频。这些视频展示了尚未发布的 Sora AI 视频模型的惊人潜力。 Sora 于今年二月首次宣布&#xff0c;但由于生成时间、成本和错误信息的潜在风险&#xff0c;光年AI 仅向一小部分创作者 开放了该模型。 自So…...

计算机视觉学习路线

计算机视觉是一门让机器理解和解释视觉世界的科学&#xff0c;它涉及到图像识别、图像处理、模式识别等多个方向。学习计算机视觉的路线通常包括以下几个阶段&#xff1a; 数学和编程基础&#xff1a;需要掌握微积分、线性代数、概率论等数学知识&#xff0c;以及Python或C等编…...

JNPF快速开发平台在企业中的应用

随着数字化转型的浪潮席卷全球&#xff0c;企业纷纷寻求高效、灵活的解决方案以适应快速变化的市场需求。在这一背景下&#xff0c;低代码开发平台应运而生&#xff0c;成为数字经济的“软基建”。今天&#xff0c;我们就来探讨JNPF快速开发平台如何在企业中发挥作用&#xff0…...

Mysql高级篇(中)—— 索引优化

Mysql高级篇&#xff08;中&#xff09;—— 索引优化 一、索引分析案例案例 1&#xff1a;单表查询案例 2&#xff1a;两表连接查询案例 3&#xff1a;三表连接查询 二、避免索引失效常见索引失效场景简述场景 1场景 2场景 3场景 4场景 5场景 6 三、索引优化文字版示例版 一、…...

electron: 将网址打包成exe桌面应用

项目场景&#xff1a; 在项目开发的过程中&#xff0c;需要将应用搭建在不同的硬件上。如需要在一个触屏显示器上展示企业相关的应用。 如果专门去开发一个这样的应用&#xff0c;不划算&#xff1b;这时候考虑将网址打包成exe应用&#xff0c;并安装触屏器上&#xff0c;就可…...

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

文章目录 PyQt5超详细教程前言第7部分&#xff1a;生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1&#xff1a;嵌入简单的 matplotlib 图表代码详解&#xff1a; 7.3 动态生成图表示例 2&#xff1a;动态更新图表代码详解&…...

2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏

主要是讲脉冲控制步进&#xff0c;因为etherCat是标准化的&#xff0c;直接通过轴控指令即可控制&#xff1b;canopen也涉及轴控指令&#xff0c;但配置稍微有点不一样。 控制本体端口的步进&#xff0c;通过发脉冲或者脉冲定位信号。 但这个4PM只有单独的轴控指令&#xff0c;…...

RGB与CMYK互转

先定义一个CMYK数据结构&#xff1a; typedef struct struCMYK {int m_nC;int m_nM;int m_nY;int m_nK; }CMYK;RGB转CMYK void CvtRGB2CMYK(COLORREF& clr, CMYK& cmyk) {double dR GetBValue(clr) / 255.0;double dG GetGValue(clr) / 255.0;double dB GetRValue…...

滴~“TOP期刊体验卡”已到期!公认水刊的尽头,还得是你MDPI

【SciencePub学术】本期&#xff0c;给大家介绍的是1本MDPI旗下的计算机类SCI——《Remote Sensing》。 优点VS缺点 • 期刊分区一直维持在较高水平 • 审稿速度极快&#xff0c;1-2个月录用见刊 • 年刊文量大&#xff0c;收稿多 • 期刊自引率较高 • 期刊系统初筛较难 • …...

ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能

适用型号&#xff1a;【GA605WI、GA605WV】&#xff0c;原装出厂Windows11系统工厂包下载 链接&#xff1a;https://pan.baidu.com/s/1IVolLwB7fddGKZY0IxOqaA?pwd62e2 提取码&#xff1a;62e2 华硕原装系统工厂安装包&#xff0c;带有MyASUS WinRE RECOVERY恢复功能、自带…...

想入行在线教育?你必须知道的十件事

在最近几年受新冠疫情和异常天气的影响&#xff0c;越来越多的教育活动被迫转移到线上。然而&#xff0c;在线课程的短板也很明显&#xff0c;大部分在线教育工作者难以有效地引导学生集中注意力&#xff0c;并且无法像线下授课一样进行同步考试。 那么&#xff0c;有什么办法…...

EasyExcel相关整理

一、实体类常用注解 1、字段注解ExcelProperty&#xff0c;一般常用value标明表头&#xff0c;index标明列 2、实体类注解&#xff08;导出样式设置&#xff09; 3、导出特殊类型转换 二、导出 1、导出多个sheet 2、导出数据量大导致内存溢出 三、导入 待更新...

2024年【汽车驾驶员(技师)】考试题及汽车驾驶员(技师)找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;技师&#xff09;考试题根据新汽车驾驶员&#xff08;技师&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将汽车驾驶员&#xff08;技师&#xff09;模拟考试试题进行汇编&#…...

[C#学习笔记]接口的特性与用法

视频地址&#xff1a;一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、总览 public interface IOverall {/// <summary>/// 最普通的方法/// </summary>v…...

java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465

发现问题 我使用的 docker 运行的 jdk 环境&#xff0c;服务调用发送邮件报错 javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465;nested exception is:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protoc…...

开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐

开放式耳机有以下好处&#xff1a; 佩戴舒适&#xff1a;开放式耳机不入耳&#xff0c;不堵塞耳道&#xff0c;长时间佩戴耳朵不易感到闷热和疼痛&#xff0c;相比传统入耳式耳机&#xff0c;能减少对耳道的压迫感和摩擦&#xff0c;让耳朵更舒适。 更健康卫生&#xff1a;不入…...

FreeRTOS(速记版)

第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可&#xff0c;这允许将 FreeRTOS 操作系统用于商业应用&#xff0c;并且不需要公开源代码。此外&#xff0c;FreeRTOS 还衍生出了另外两个操作系统&#xff1a;OpenRTOS 和 SafeRTOS&#xff0c;其中 OpenR…...

解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势

解锁中东市场新蓝海&#xff1a;Bigo社交媒体如何赋能APP广告营销优势 在全球数字化浪潮的推动下&#xff0c;中东地区以其独特的文化背景、高速的经济增长以及庞大的年轻消费群体&#xff0c;成为了众多品牌与APP开发者竞相争夺的市场高地。作为该地区颇具影响力的社交媒体平…...

【网络】DNS

definition DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;服务器是互联网上的重要基础设施之一&#xff0c;它的主要作用是将人们易于记忆的域名&#xff08;如www.example.com&#xff09;转换成计算机可以直接识别的IP地址&#xff08;如192.0.2.1&am…...

如何使用ChatGPT,完成学术论文文献综述的编写?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究中&#xff0c;文献综述是了解研究现状、辨识研究空白并为自己的研究奠定理论基础的关键环节。ChatGPT 可以在文献综述的编写过程中提供有效的支持&#xff0c;从文献搜集、批…...