我正在尝试使用 dbUnit 为 MySQL 中的一个表编写集成测试,该表有一列带有自动增量
。
集成测试如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={
JdbcRepositoryConfiguration.class,
DbUnitConnectionConfiguration.class
})
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
@DbUnitConfiguration(databaseConnection="dbUnitConnection")
public class IntegrationTest {
@Autowired private JdbcRepositoryConfiguration configuration;
private Loader loader;
@Before
public void setup() throws JSchException {
loader = new Loader(configuration.jdbcTemplate());
}
@Test
@DatabaseSetup("classpath:dataset.xml")
public void loads() throws Exception {
assertThat(loader.load(), contains("something"));
}
}
对于没有增量列的表,我有相同的集成测试结构,并且测试工作得很好。
dataset.xml
如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<sometable
id="1"
regexp="something"
descr="descr"
/>
</dataset>
调试我可以看到设置数据所采取的操作是删除所有数据并执行插入,更具体地说:
插入某个表(id、regexp、descr)值(?, ?, ?)
我得到的错误是:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“regexp, descr) 值 (1, 'something', 'descr')' 附近使用的正确语法
为了完整起见,DbUnitConfiguration.class
具有以下 spring bean 设置:
@Bean
public IDatabaseConnection dbUnitConnection() throws SQLException, DatabaseUnitException, JSchException {
Connection dbConn = configuration.jdbcTemplate().getDataSource().getConnection();
IDatabaseConnection connection = new DatabaseConnection(dbConn) {
@Override
public void close() throws SQLException {}
};
DatabaseConfig dbConfig = connection.getConfig();
dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
return connection;
}
最佳答案
事实证明与自动增量无关。
抛出错误是因为 regexp
列是 MySQL 中的保留字。
要解决此问题,dbUnit 设置必须具有以下行:
dbConfig.setProperty(DatabaseConfig.PROPERTY_ESCAPE_PATTERN , "`?`");
测试现在就可以运行了。
关于java - MySQL 增量列和 DBunit 数据集的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22869099/