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)
如果单独运行测试,则没有问题,只是由于内存中的数据,套件会失败。我该如何解决?
此代码将有效地擦除您的整个 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)
| 归档时间: |
|
| 查看次数: |
2235 次 |
| 最近记录: |