对 MyBatis 的 Mapper 进行单元测试时,通常会模拟数据库环境或使用嵌入式数据库(如 H2)来执行真实的 SQL 测试。以下是进行单元测试的常见方式和步骤:
方式一:使用 H2 嵌入式数据库(推荐)
这种方式可以模拟真实环境,执行 SQL 语句,适合 Mapper 测试。
步骤:
- 添加依赖(以 Maven 为例):
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
- 配置测试用的 MyBatis 配置文件或使用 Spring Boot 的
application-test.yml
:
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
mybatis:
mapper-locations: classpath*:mapper/**/*.xml
type-aliases-package: com.example.entity
- 初始化测试数据:
可在测试启动前运行 schema.sql 和 data.sql 脚本,或使用 @Sql 注解:
@Sql(scripts = {"/schema.sql", "/data.sql"})
- 编写测试类:
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectById() {
User user = userMapper.selectById(1);
Assertions.assertNotNull(user);
Assertions.assertEquals("Tom", user.getName());
}
}
方式二:使用 Mockito + MyBatis-Plus(适合只测试逻辑)
如果只关心业务逻辑,可以使用 Mockito 模拟 Mapper 接口:
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserMapper userMapper;
@InjectMocks
private UserService userService;
@Test
public void testGetUserById() {
User user = new User(1, "Alice");
Mockito.when(userMapper.selectById(1)).thenReturn(user);
User result = userService.getUserById(1);
Assertions.assertEquals("Alice", result.getName());
}
}
小贴士:
- XML 映射文件记得放在
test/resources/mapper
或用@MapperScan
扫描路径。 - 可使用 DBUnit 或 Flyway 进行测试数据管理。
- 如果使用 Spring Boot,可以用
@MybatisTest
注解简化测试配置。
总结:
方法 | 特点 | 是否连接数据库 |
---|---|---|
嵌入式 H2 数据库 | 真实 SQL 执行,最接近生产环境 | 是 |
Mockito 模拟 | 快速测试逻辑,适合 Service 层 | 否 |