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
@Before
public void setup() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
// 测试获取用户的方法
@Test
public 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
:配置信息,程序初始化时的信息。FINE
、FINER
、FINEST
:调试信息,显示程序细节,日志级别递增。
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
配置文件,设置 logImpl
为 LOG4J
:
<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 的执行情况,方便调试。