java - MySQL 增量列和 DBunit 数据集的问题

标签 java mysql jdbctemplate dbunit spring-test-dbunit

我正在尝试使用 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/

相关文章:

java - Spring 4 TaskScheduler 性能问题

java - 创建资源路径时从 ZipFileSystemProvider 获取 FileSystemNotFoundException

php - 为什么我无法在 IOS 应用程序中使用 NSURLConnection 使用 php 页面将记录重新添加到数据库?

mysql - 获取 Woocommerce 客户订单语言

java - Oracle 数据源连接池不适用于 Spring 和 JDBCTemplate

java - 使用 Spring JDBCTemplate 更新结果集

java - 使用 jdbctemplate 插入行,PrimaryKey 由 @GenerateValue 生成

java - Junit 异常初始化错误

java - 如何检测纹理何时被破坏

MySQL错误,未知原因