单元测试
AutoTable 提供了专门的测试注解,方便在单元测试中使用。
@EnableAutoTableTest
java
@EnableAutoTableTest
@SpringBootTest
public class UserTableTest {
@Test
void testCreateTable() {
// 测试代码
}
}特性
- 每个测试类独立的 AutoTable 配置
- 不影响主应用的配置
- 可指定特定的实体类进行测试
参数
java
@EnableAutoTableTest(
basePackages = {"com.example.entity"}, // 扫描包
classes = {User.class, Order.class} // 指定类
)测试配置
使用内存数据库
推荐使用 H2 进行单元测试:
yaml
# application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
auto-table:
mode: create # 每次测试重建表测试隔离
每个测试方法使用独立的数据库:
java
@EnableAutoTableTest
@SpringBootTest
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class IsolatedTest {
// 每个测试方法前重置 Spring 上下文
}示例
测试表创建
java
@EnableAutoTableTest(classes = {User.class})
@SpringBootTest
public class UserTableTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void shouldCreateUserTable() {
// 验证表存在
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'user'",
Integer.class
);
assertEquals(1, count);
}
@Test
void shouldHaveCorrectColumns() {
// 验证字段
List<Map<String, Object>> columns = jdbcTemplate.queryForList(
"SELECT column_name FROM information_schema.columns WHERE table_name = 'user'"
);
assertTrue(columns.stream().anyMatch(c -> "username".equals(c.get("column_name"))));
}
}测试表更新
java
@Test
void shouldAddNewColumn() {
// 1. 首次创建表
AutoTableBootstrap.start();
// 2. 修改实体(模拟)
// 3. 再次执行
AutoTableBootstrap.start();
// 4. 验证新字段存在
}不使用 @EnableAutoTableTest
如果主应用没有添加 @EnableAutoTable,也可以直接使用:
java
@SpringBootTest
public class ManualTest {
@Autowired
private DataSource dataSource;
@BeforeEach
void setup() {
DataSourceManager.setDataSource(dataSource);
AutoTableGlobalConfig.instance().setAutoTableProperties(new PropertyConfig());
AutoTableGlobalConfig.instance().setUnitTestMode(true);
}
@Test
void test() {
AutoTableBootstrap.start();
// 验证
}
@AfterEach
void cleanup() {
AutoTableGlobalConfig.clear();
}
}