在不删除表的情况下擦除 H2 数据

log*_*ger 3 java junit spring h2

我正在为我的一个项目编写 JUnit 测试,这些测试都是用 H2 数据库完成的。

设置由 XML 文件(包含 spring beans 和 db setup)、SQL 文件(包含数据/模式)和 java 文件(仅测试)组成

每当运行 JUnit 测试套件时,由于重复数据(因为 H2 在内存中),某些测试将失败,我想知道是否有办法在某些类之前擦除 H2 数据?

@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_CLASS)
Run Code Online (Sandbox Code Playgroud)

已经尝试过,但由于运行我们的一些测试所需的时间限制,它在我们的案例中不可用。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("test.xml")
public class ABCTest {

    private static final Logger log = Logger.getLogger(ABC.class);

    @Autowired
    private ABCDao;

    ....

    @After
    public void tearDown(){
       ABCDao = null;
       ...
    }

    @Test
    public void test() {

    ...

    }

}
Run Code Online (Sandbox Code Playgroud)

上面几乎是每个类的设置或类似的构造。

@RunWith(Suite.class)
@Suite.SuiteClasses({
    ABCTest.class,
    DEFTest.class,
    GHITest.class,
    ....
    TUVTest.class, //this fails <---
    XYXTest.class

})

public class AllTests {
}
Run Code Online (Sandbox Code Playgroud)

如果单独运行测试,则没有问题,只是由于内存中的数据,套件会失败。我该如何解决?

Dav*_*iro 5

此代码将有效地擦除您的整个 H2 DB(只需在使用@BeforeJUnit 规则的任何测试方法之前运行它):

public static void truncateAll(JdbcTemplate jdbcTemplate) throws SQLException {
    jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY FALSE");

    try {
        Iterator var1 = getTableNames(jdbcTemplate).iterator();

        while(var1.hasNext()) {
            String tableName = (String)var1.next();
            jdbcTemplate.execute("TRUNCATE TABLE " + tableName);
        }
    } finally {
        jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY TRUE");
    }

}

private static List<String> getTableNames(JdbcTemplate jdbcTemplate) throws SQLException {
    return (List)jdbcTemplate.execute(new ConnectionCallback() {
        public List<String> doInConnection(Connection conn) throws SQLException, DataAccessException {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet tables = metaData.getTables((String)null, (String)null, "%", new String[]{"TABLE"});
            ArrayList tableNames = Lists.newArrayList();

            try {
                while(tables.next()) {
                    tableNames.add(tables.getString("TABLE_NAME"));
                }
            } finally {
                tables.close();
            }

            return tableNames;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)