JUnit使用HyperSQL来测试DAO类

时间:2016-01-11 09:12:42

标签: java unit-testing

我做了一些关于如何使用HyperSQL测试DAO层的研究,我发现了这个问题: https://softwareengineering.stackexchange.com/questions/219362/how-to-test-the-data-access-layer

如何导入DBConnection,因为我尝试使用hypersql jar并且它不起作用。在链接的问题中,我看到了db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;,但我不知道如何使用它。

1 个答案:

答案 0 :(得分:1)

使用JDBC和Spring,在您的应用程序中,您将创建一个DataSource对象,并使用该对象创建一个JdbcTemplate对象,这是您用来运行JDBC查询的对象。与this示例类似。因此,为了使用HSql数据库,您需要更改用于设置DataSource bean的值,但仅用于单元测试。

根据您使用Spring(注释,xml配置)的方式,有几种方法可以实现。您需要创建一个新的配置bean或配置xml文件,然后在单元测试中引用它。

对于XML,复制弹簧上下文xml文件,并将DataSource值更改为:

<bean id="dataSource" 
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
  <property name="url" value="jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;"/>
  <property name="username" value="SA"/>
  <property name="password" value=""/>

然后,您需要在单元测试中引用此新的上下文配置。类似的东西:

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "classpath:/test-config.xml"
@ContextConfiguration("/test-config.xml")
public class DAOTests {
    @Autowired
    private DatabaseDAO dao;
}

使用注释,您需要创建一个新的配置类(您应该已经创建了一个类,一个用@Configuration注释的类)并返回相应的DataSource。像这样:

@Bean
public DataSource hsqlDataSource(){
    return DataSourceBuilder
        .create()
        .driverClassName("org.hsql.jdbcDriver")
        .url("jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;")
        .username("SA")
        .password("");
        .build();
}

您可以为配置设置配置文件(使用@Profile("test")注释),然后指定要在单元测试中使用的配置文件(@ActiveProfiles("test"))。更多信息here

或者,如果您只是尝试进行简单的DAO测试,则可以使用Spring EmbeddedDatabaseBuilder。有一个教程here。它为您设置内存数据库中的HSql(而不是基于文件的数据库),这对于设置/拆除非常方便。只需将bean添加到配置类中,如果Spring为您注入DataSource,您的DAO应该选择它。以下示例取自here

@Bean
public DataSource dataSource() {

    // no need shutdown, EmbeddedDatabaseFactoryBean will take care of this
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.HSQL)
        .addScript("db/setup_script.sql")
        .build();
}

有一些Spring配置管理。我在这个答案中没有详细介绍它,但是查看一些例子,它将开始有意义。