0

I have a simple spring project and try to use spring-dbunit to do some services tests. I use jdbcTemplate for DB access. Beans configuration:

<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>

Test class looks like:

    @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 is a simply data set:

<?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>

I have to errors in configuration, but when call carService.sizeInGarage() I see message:

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]

Should I init DB before run test or problem is with @DatabaseSetup and cannnot find xml file? How check that hsqldb started and working correct?

1 Answer 1

1

You need to provide a way to create your schema before running your unit tests. The way DbUnit works is by putting your database in a "known state" before running the particular test.

If you have a RDBMS installed, you should have already the database created; but if you are using an in-memory database (more likely for this matters) you must provide a SQL script (or some other way) to be able to create the schema for you when the in-memory database is started.

Have a look here, this may helps.

Sign up to request clarification or add additional context in comments.

1 Comment

Yes, you have right. I had to init DB schema first. In sswai-test.xml I added: \n <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="init-datasource.sql"/> </jdbc:initialize-database> where init-datasource.sql just creats table car.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.