先来看一个DataBase-Rider的案例
@ExtendWith(DBUnitExtension.class) @RunWith(JUnitPlatform.class) public class DBUnitJUnit5Test { private ConnectionHolder connectionHolder = () -> instance("junit5-pu").connection(); (1) @Test @DataSet("users.yml") public void shouldListUsers() { List<User> users = em().createQuery("select u from User u").getResultList(); assertThat(users).isNotNull().isNotEmpty().hasSize(2); } |
@DataSet是DBRider最基础和重要的一个注解,主要用来控制目标数据库的上下文。在前述案例中,通过这简单的一行代码,就实现了将一个用例所需要的完整数据库上下文内容导入到了数据库中。
当然,实际测试项目中,数据的导入还有许多复杂的场景需要应对。
笔者简要介绍一下在实际工作中使用较多的几个属性
那么这个@dataset注解提供的这么多操作,在导入数据的过程中是如何执行的呢?从com.github.database.rider.core.dataset.DataSetExecutorImpl这个类的createDataSet方法的实现中可以了解到各个注解的执行先后顺序。源码如下:
@Override public void createDataSet(DataSetConfig dataSetConfig) { if (printDBUnitConfig.compareAndSet(true, false)) { StringBuilder sb = new StringBuilder(150); sb.append("cacheConnection: ") .append("" + dbUnitConfig.isCacheConnection()).append("\n") .append("cacheTableNames: ") .append(dbUnitConfig.isCacheTableNames()).append("\n") .append("leakHunter: ") .append("" + dbUnitConfig.isLeakHunter()).append("\n"); for (Entry<String, Object> entry : dbUnitConfig.getProperties().entrySet()) { sb.append(entry.getKey()).append(": ).append(entry.getValue()).append("\n"); } log.info(String.format("DBUnit configuration for dataset executor '%s':\n" + sb.toString(), this.executorId)); } if (dataSetConfig != null) { try { if (dataSetConfig.isDisableConstraints()) { disableConstraints(); } if (dataSetConfig.isCleanBefore()) { try { clearDatabase(dataSetConfig); } catch (SQLException e) { LoggerFactory.getLogger(DataSetExecutorImpl.class.getName()) .warn("Could not clean database before test.", e); } } if (dataSetConfig.getExecuteStatementsBefore() != null && dataSetConfig.getExecuteStatementsBefore().length > 0) { executeStatements(dataSetConfig.getExecuteStatementsBefore()); } if (dataSetConfig.getExecuteScriptsBefore() != null && dataSetConfig.getExecuteScriptsBefore().length > 0) { for (int i = 0; i < dataSetConfig.getExecuteScriptsBefore().length; i++) { executeScript(dataSetConfig.getExecuteScriptsBefore()[i]); } } if (dataSetConfig.hasDatasets()) { IDataSet resultingDataSet = loadDataSets(dataSetConfig.getDatasets()); resultingDataSet = performSequenceFiltering(dataSetConfig, resultingDataSet); resultingDataSet = performTableOrdering(dataSetConfig, resultingDataSet); resultingDataSet = performReplacements(resultingDataSet); DatabaseOperation operation = getOperation(dataSetConfig); operation.execute(getRiderDataSource().getDBUnitConnection(), resultingDataSet); } } catch (Exception e) { throw new DataBaseSeedingException("Could not initialize dataset: " + dataSetConfig, e); } } } |
看上去是分为DataSet执行前和执行中两个分类。在真正导入数据的操作执行前,会执行以下操作,
DisableConstraints CleanBefore ExecuteStatementsBefore ExecuteScriptsBefore |
而在DataSet执行过程中,为了对数据进行一些处理,还会依次执行以下的操作
performSequenceFiltering(dataSetConfig, resultingDataSet); performTableOrdering(dataSetConfig, resultingDataSet); performReplacements(resultingDataSet); |
了解了各个方法的运行时机,就可以在实际项目中准确使用了。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理