开源项目文档翻译###Spring Test DBUnit###

http://springtestdbunit.github.com/spring-test-dbunit/

简介:

SPring DBUnit 提供了spring测试框架和流行的DBunit项目的集成。经过简单的注解,它能让你设置和销毁数据库表,同时在测试完成时,检查符合预期的表的内容。 java

项目能够配置运行DBUnit测试经过使用Spring TestExecutionListener 或者使用一个JUnit @Rule.使用JUnit@Rule能够更容易配置可是只有在你使用JUnit4.7+才有效。 git

使用Spring TestExecutionListener的配置

注意:本部分配置DBUnit测试,运行时使用Spring TestExecutionListener。若是你想使用JUnit @Rule配置DBUnit,看下一节。 github

为了让Sring处理DBUnit注解,你必须首先配置你的测试去使用DBUnitTestExecution类。你须要使用Spring @TestExecutionListeners 注解。通常来讲,除了DBUnitTestExecutionListener,你同时须要包括标准Spring 监听器。下面是一个典型的JUnit4测试的注解。 spring

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class })
查看Spring javaDocs中关于标准监听器的介绍获取详细信息。

为了链接数据库,Spring DBUnit 须要一个bean 被注册到你的测试XML文件中。默认一个bean命名或者能够被使用(若是你须要其余的名字,查看高级配置小节)。bean 能够引用一个IDatabaseConnection或者更加典型的一个Java数据源。下面是一个典型的配置,链接超音速内存数据库。 数据库

当你配置了DbUnitTestExcutionListener,同时提供了链接数据库的bean,你就能够使用DBUnit注解了。 框架

使用JUnit @Rule配置 测试

注意:JUnit @Rule配置如今不能和Spring3.1工做,除非问题解决了,不然请使用TestExecutionListener。 spa

本小节配置DBUnit 测试运行在JUnit4.7+@Rule。查看上面若是你但愿配置DBUnit测试使用Spring TestExecutionListener. code

为了让JUnit处理DBUnit注解,你必须配置你的测试使用DbUnitRule @Rule。为此你须要使用Junit@Rule注解,结合DbUnitRule类。 xml

@Rule
public DbUnitRule dbUnit = new DbUnitRule();
你同时也须要确保你的测试类提供了获取数据源或者IDtabaseConnection的方法。你能够使用setDataSource或者setDatabaseConnection方法在规则上,或者更加通用的,注入一个数据源到一个测试类的私有的字段中。
@Autowired
private DataSource dataSource;
一旦你的规则定义好了你能够使用DBUnit注解了。

设置和销毁

注意:在任何注解能够使用以前,你须要完成上面的配置小结步骤。没有合适的配置,DBUnit注解将被忽略。

@DatabaseSetup 和@DatabaseTearDown 注解用来在测试执行以前配置数据库表,在测试执行完成后重置它们。

设置

@DatabaseSetup注解暗示了数据库表应该在方法运行以前设置。注解能够在单个测试方法或者整个类上起做用。

看成用到类的级别上时,设置在测试的每一个方法上发生。注解的值引用了一个文件包含了能够重置数据库表的数据集。

典型的是一个标准的DBUnit XML文件,尽管它也能够加载自定义类型(看下面)。

下面是一个典型的设置注解。在本例中,一个和测试文件相同的包下面的名称为sampleData.xml的文件被引用了。

@DatabaseSetup("sampleData.xml")
同时也能够引用特定位置的资源,例如:
@DatabaseSetup("/META-INF/dbtest/sampleData.xml")
默认状况下设置将执行一个操做。这意味着从XML数据集中引用的表的全部的数据在被插入新的行以前将被删除。 经过使用类型属性,标准的DBUnit操做将被支持。看下面的JavaDocs看查看详细。

销毁

@DatabaseTearDown注解能够用来重置数据库表当测试完成时。和@DatabaseSetup同样的是,这个注解能够在方法或者类层面上起效。当使用@DatabaseTearDown时,使用和@DatabaseSetup相同的方式使用值和类别属性。

指望的结果

@ExpectedDatabase注解能够用来在测试完成时,检验数据库内容。当一个测试执行了一个插入,更新或者删除操做,你将典型的使用这个注解。你能够将这个注解用到一个单一的测试方法或者类中。当用在类级别上时,每一个方法执行后都会调用检验程序。

@ExpectedDatabase 注解须要一个value属性,这个属性引用数据集文件用来检验结果。下面是一个典型的例子。

@ExpectedDatabase("expectedData.xml")
@ExpectedDatabase注解支持两种不一样的模式。DatabaseAssertionMode.DEFAULT做为一个标准的DbUnit测试运行,执行一个完整的指望数据集和实际数据集的比对。DatabaseAssertionMode.NON_STRICT将忽略没有在指望数据集中出现,可是在实际数据集中出现的 表和列名。当集成测试执行在实际数据库包含不少有不少列的表中, 这将十分有用。咱们不须要定义全部的这些,只须要咱们感兴趣的表和列。

注意:若是你在测试中使用这个注解的同时还使用了@Transactional,你须要一个可选的配置。参见下面的小节。

事务

若是你配置DBUnit测试,使用了DbUnitTestExecutionListener以及使用了TransactionalTestExcecutionListener,你可能会经历事务在你的数据设置以前没有启动的问题,或者在指望的数据集校验以前就回滚的问题。为了让DBUnit支持@Transactional 测试,你须要使用TransactionDbUnitTestExecutionListener类。

注意:TransactionDbUnitExecutionListener提供了DBUnit和Transactional支持。当使用TransactionDbUnitTestExecutionListener时,你必须禁止使用TransactionalTestExecutionListener或者DbUnitTestExceutionListener类。

下面是一个典型的JUnit4测试类的注解:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalDbUnitTestExecutionListener.class })
事务在@DatabaseSetup以前被调用,在@DatabaseTearDown 和@ExpectedDatabase以后被结束。

DbUnitTestExecutionListener的高级配置

注意:这个小结仅仅在你使用DbUnitTestExecutionListener时起效。若是你使用了Junit@Rule,参看下一小结。

若是你须要为DBUnit配置高级选项,@DbUnitConfiguration注解能够被使用。

databaseConnection属性容许你精肯定位一个包含数据链接的Spring Context中的bean。当没有定义名字时也能够使用。这个bean必须实现IDatabaseConnection或者一个DataSource.

DbUnitRule的高级配置

注意:本小节仅仅在你使用DBUnitRule JUnit @Rule时起效。查看下面的部分若是你使用的时DbUnitTestExecutionListener;

DBUnitRule JUnit rule 将查看你的测试类中的私有的字段,用来配置本身。若是你的测试包括了一个DataSource字段或者一个IDataBaseConnection字段,这个将被使用来获取一个数据库链接。你也能够包括一个DataSetLoader字段若是你但愿可以使用一个自定义加载器当读取数据集的时候(看下面)。

若是你须要更多的细粒度的控制,你也能够调用rule上的setter方法。

自定义IDatabaseConnections

在一些场合下你可能须要建立一个IDatabaseConnection利用一个特定的DBUnit配置。不巧的是,标准DBUnit DatabaseConfig类不能被Sprign容易的使用。为了克服这个缺陷,DatabaseConfigBean提供了一个可选的方法用来配置一个链接。提供标准的getter/setter提供给全部的配置选项。DatabaseDataSourceConnectionFactoryBean 接收一个配置属性,应该用来构建最终的链接。下面是一个典型的例子:

<bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean">
    <property name="skipOracleRecyclebinTables" value="true"/>
</bean>

<bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
    <property name="databaseConfig" ref="dbUnitDatabaseConfig"/>
</bean>
注意:在最多的场合下,username和password属性必须不被DataabaseDataSourceConnectionFactoryBean设置.这些属性引发DBUnit启动一个新的事物,将致使一个不能预料的行为。

写一个数据集加载器

默认状况下,DBUnit数据集经过普通的XML文件加载。若是你须要从其余数据源中加载数据,你想要写你本身的数据集加载器,配置你的测试来使用它。自定义加载器必须实现DataSetLoader接口,提供一个loadDataSet方法的实现。AbstractDataSetLoader对于大多数加载器而言,提供了一个方便的基类,也能够使用。

下面是一个从CSV文件中读取数据的加载器的例子。

public class CsvDataSetLoader extends AbstractDataSetLoader {
    protected IDataSet createDataSet(Resource resource) throws Exception {
        return new CsvURLDataSet(resource.getURL());
    }
}
参考上面的详细信息用来配置一个测试类使用加载器。
相关文章
相关标签/搜索