如何使用数据库单元初始化数据库(Table 未在语句中找到)?

How init DB with database-unit (Table not found in statement)?

我有一个简单的 spring 项目并尝试使用 spring-dbunit to do some services tests. I use jdbcTemplate 进行数据库访问。 Bean 配置:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" c:dataSource-ref="dataSource"/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:springtestdbunit"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

测试 class 看起来像:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"/it/tostao/sswa/sswai-test.xml"})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class})
    public class CarServiceImplTest {

        Logger LOG = LoggerFactory.getLogger(CarServiceImplTest.class);

        @Autowired
        private JdbcTemplate jdbcTemplate;

        private CarService carService;

        @Before
        public void setUp() {
            carService = new CarServiceImpl(jdbcTemplate);
        }

        /**
         * Test cars counter.
         */
        @Test
        @DatabaseSetup("cars.xml")
        public void checkCounter() {
            int nbOfCarsInGarage = carService.sizeInGarage();//SELECT count(*) from car;
            LOG.info("No of cars = " + nbOfCarsInGarage);
            Assert.assertEquals(2, nbOfCarsInGarage);
        }    
}

Cars.xml是一个简单的数据集:

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <car brand="BMW" model="E91" year="2006" doorsNumber="5" plate="XXX1234" />
    <car brand="Hyundai" model="Accent" year="2000" doorsNumber="4" plate="YYY333" />
</dataset>

我必须在配置中出错,但是当调用 carService.sizeInGarage() 时我看到消息:

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT count() FROM car]; nested exception is java.sql.SQLException: Table not found in statement [SELECT count() FROM car]

我应该在 运行 测试之前初始化 DB 还是问题出在 @DatabaseSetup 并且找不到 xml 文件?如何检查 hsqldb 是否已启动并正常工作?

您需要提供一种在运行单元测试之前创建架构的方法。 DbUnit 的工作方式是将数据库放在特定测试 运行 之前的 "known state" 中。

如果您安装了 RDBMS,您应该已经创建了数据库;但是如果您使用的是内存数据库(更可能是因为这个问题),您必须提供一个 SQL 脚本(或其他方式)以便能够在内存数据库启动时为您创建模式.

看看here,这可能会有所帮助。