对 MyBatis 的 Mapper 进行单元测试时,通常会模拟数据库环境或使用嵌入式数据库(如 H2)来执行真实的 SQL 测试。以下是进行单元测试的常见方式和步骤:

方式一:使用 H2 嵌入式数据库(推荐)

这种方式可以模拟真实环境,执行 SQL 语句,适合 Mapper 测试。

步骤:

  1. 添加依赖(以 Maven 为例)
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
  1. 配置测试用的 MyBatis 配置文件或使用 Spring Bootapplication-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
  1. 初始化测试数据

可在测试启动前运行 schema.sql 和 data.sql 脚本,或使用 @Sql 注解:

@Sql(scripts = {"/schema.sql", "/data.sql"})
  1. 编写测试类
@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 扫描路径。
  • 可使用 DBUnitFlyway 进行测试数据管理。
  • 如果使用 Spring Boot,可以用 @MybatisTest 注解简化测试配置。

总结:

方法特点是否连接数据库
嵌入式 H2 数据库真实 SQL 执行,最接近生产环境
Mockito 模拟快速测试逻辑,适合 Service 层