Skip to content

单元测试

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();
    }
}

Released under the Apache 2.0 License.