Java 使用JPA和Spring进行集成测试
我有一个Spring/JPA web应用程序,我想为它编写一些测试。理想情况下,我希望能够:Java 使用JPA和Spring进行集成测试,java,maven-2,jpa,integration-testing,dbunit,Java,Maven 2,Jpa,Integration Testing,Dbunit,我有一个Spring/JPA web应用程序,我想为它编写一些测试。理想情况下,我希望能够: 在测试运行之前创建一次测试数据库模式(来自JPA注释类) 在自己的事务中运行每个测试方法,该事务在测试完成时回滚 指定要在每个类或每个方法级别为每个测试加载的(DbUnit)数据集。应在事务启动后加载测试数据,以便在测试完成时回滚测试数据 将Springbean注入测试类 我知道Spring提供的类可以提供我正在寻找的事务行为。理想情况下,最终的解决方案将是这样的 // This dataset w
- 在测试运行之前创建一次测试数据库模式(来自JPA注释类)
- 在自己的事务中运行每个测试方法,该事务在测试完成时回滚
- 指定要在每个类或每个方法级别为每个测试加载的(DbUnit)数据集。应在事务启动后加载测试数据,以便在测试完成时回滚测试数据
- 将Springbean注入测试类
// This dataset will be used for all tests that don't override it with their own annotation
@TestData('/dbunit/dataSetDefault.xml')
public class MyTests extends ProbablySomethingFromTheSpringFramework {
@Test
void testWithDefaultDataSet() {
// Transaction is implicitly started here
// My test code goes here
// A transaction is implicitly rolled-back here
}
@TestData('/dbunit/dataSetCustom.xml')
@Test
void testWithCustomDataSet() {
// Same as the other test
}
}
显然,父类和@TestData
都是虚构的,有什么东西可以提供我想要的功能吗
这就留下了如何创建测试数据库模式的问题。理想情况下,这将在所有测试运行之前发生一次(由Maven执行)。有人能建议我如何做到这一点吗?我想这涉及到使用一些东西将JPA注释转换为DDL,然后使用其他东西将其加载到测试数据库模式中
谢谢 我用一个简单的基于JPA(Hibernate)的应用程序做到了这一点
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.soebes.casestudy</groupId>
<artifactId>casestudy</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Case Study Pizza Ordering</name>
<url>Pizza Ordering</url>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hibernate-core-version>3.4.0.GA</hibernate-core-version>
<database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName>
<database.url>jdbc:mysql://localhost:3306/casestudy</database.url>
<database.dialect>org.hibernate.dialect.MySQLDialect</database.dialect>
<database.root.user>root</database.root.user>
<database.root.password>root</database.root.password>
<database.user>casestudy</database.user>
<database.password>casestudy</database.password>
<database.database>casestudy</database.database>
</properties>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>hibernate-create-schema</id>
<phase>generate-test-sources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>annotationconfiguration</implementation>
</component>
</components>
<componentProperties>
<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
<jdk5>true</jdk5>
<packagename>com.soebes.casestudy.bo</packagename>
<console>false</console>
<outputfilename>create.sql</outputfilename>
<drop>false</drop>
<create>true</create>
<update>false</update>
<export>false</export>
<format>true</format>
</componentProperties>
</configuration>
</execution>
<execution>
<id>hibernate-drop-schema</id>
<phase>generate-test-sources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>annotationconfiguration</implementation>
</component>
</components>
<componentProperties>
<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
<jdk5>true</jdk5>
<packagename>com.soebes.casestudy.bo</packagename>
<console>false</console>
<outputfilename>drop.sql</outputfilename>
<drop>true</drop>
<create>false</create>
<update>false</update>
<export>false</export>
<format>true</format>
</componentProperties>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.4</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
<!-- common configuration shared by all executions -->
<configuration>
<driver>${database.driverClassName}</driver>
<url>${database.url}</url>
<username>${database.root.user}</username>
<password>${database.root.password}</password>
</configuration>
<executions>
<execution>
<id>drop-database</id>
<phase>generate-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<sqlCommand>
DROP DATABASE IF EXISTS casestudy;
CREATE DATABASE casestudy;
GRANT ALL ON casestudy.* TO ${database.user} IDENTIFIED BY '${database.password}';
</sqlCommand>
</configuration>
</execution>
<execution>
<id>create-database</id>
<phase>generate-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<sqlCommand>
USE casestudy;
</sqlCommand>
<srcFiles>
<srcFile>${project.build.directory}/hibernate3/sql/create.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${hibernate-core-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.0.SP1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.4.GA</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.14.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
4.0.0
com.soebes.casestudy
案例分析
罐子
0.0.1-快照
比萨饼订购案例研究
比萨饼订购
UTF-8
UTF-8
3.4.0.GA
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/casestudy
org.hibernate.dialogue.mysqldialogue
根
根
案例分析
案例分析
案例分析
${basedir}/src/main/resources
真的
org.codehaus.mojo
hibernate3 maven插件
2.2
hibernate创建模式
生成测试源
hbm2ddl
hbm2ddl
注释配置
/src/main/resources/hibernate.cfg.xml
真的
com.soebes.casestudy.bo
假的
create.sql
假的
真的
假的
假的
真的
休眠删除模式
生成测试源
hbm2ddl
hbm2ddl
注释配置
/src/main/resources/hibernate.cfg.xml
真的
com.soebes.casestudy.bo
假的
drop.sql
真的
假的
假的
假的
真的
mysql
mysql连接器java
5.1.9
org.apache.maven.plugins
maven surefire插件
2.8
org.codehaus.mojo
SQLMaven插件
1.4
mysql
mysql连接器java
5.1.9
${database.driverClassName}
${database.url}
${database.root.user}
${database.root.password}
删除数据库
生成测试资源
执行
如果存在案例研究,则删除数据库;
创建数据库案例研究;
将所有案例研究。*授予${database.password}标识的${database.user};
创建数据库
生成测试资源
执行
使用案例研究;
${project.build.directory}/hibernate3/sql/create.sql
org.hibernate
休眠注释
${hibernate核心版本}
org.hibernate
冬眠核心
3.3.0.SP1
javassist
javassist
3.4.GA
org.testng
testng
5.14.6
测试
mysql
mysql连接器java
5.1.9
log4j
log4j
1.2.13
编译
org.slf4j
slf4j api
1.6.1
org.slf4j
slf4j-log4j12
1.6.1
我已经用一个简单的基于JPA(Hibernate)的应用程序做到了这一点
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.soebes.casestudy</groupId>
<artifactId>casestudy</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Case Study Pizza Ordering</name>
<url>Pizza Ordering</url>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hibernate-core-version>3.4.0.GA</hibernate-core-version>
<database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName>
<database.url>jdbc:mysql://localhost:3306/casestudy</database.url>
<database.dialect>org.hibernate.dialect.MySQLDialect</database.dialect>
<database.root.user>root</database.root.user>
<database.root.password>root</database.root.password>
<database.user>casestudy</database.user>
<database.password>casestudy</database.password>
<database.database>casestudy</database.database>
</properties>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>hibernate-create-schema</id>
<phase>generate-test-sources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>annotationconfiguration</implementation>
</component>
</components>
<componentProperties>
<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
<jdk5>true</jdk5>
<packagename>com.soebes.casestudy.bo</packagename>
<console>false</console>
<outputfilename>create.sql</outputfilename>
<drop>false</drop>
<create>true</create>
<update>false</update>
<export>false</export>
<format>true</format>
</componentProperties>
</configuration>
</execution>
<execution>
<id>hibernate-drop-schema</id>
<phase>generate-test-sources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>annotationconfiguration</implementation>
</component>
</components>
<componentProperties>
<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
<jdk5>true</jdk5>
<packagename>com.soebes.casestudy.bo</packagename>
<console>false</console>
<outputfilename>drop.sql</outputfilename>
<drop>true</drop>
<create>false</create>
<update>false</update>
<export>false</export>
<format>true</format>
</componentProperties>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.4</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
<!-- common configuration shared by all executions -->
<configuration>
<driver>${database.driverClassName}</driver>
<url>${database.url}</url>
<username>${database.root.user}</username>
<password>${database.root.password}</password>
</configuration>
<executions>
<execution>
<id>drop-database</id>
<phase>generate-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<sqlCommand>
DROP DATABASE IF EXISTS casestudy;
CREATE DATABASE casestudy;
GRANT ALL ON casestudy.* TO ${database.user} IDENTIFIED BY '${database.password}';
</sqlCommand>
</configuration>
</execution>
<execution>
<id>create-database</id>
<phase>generate-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<sqlCommand>
USE casestudy;
</sqlCommand>
<srcFiles>
<srcFile>${project.build.directory}/hibernate3/sql/create.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${hibernate-core-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.0.SP1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.4.GA</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.14.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
4.0.0
com.soebes.casestudy
案例分析
罐子
0.0.1-快照
比萨饼订购案例研究
比萨饼订购
UTF-8
UTF-8
3.4.0.GA
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/casestudy
org.hibernate.dialogue.mysqldialogue
根
根
案例分析
案例分析
案例分析
${basedir}/src/main/resources
真的
org.codehaus.mojo
hibernate3 maven插件
2.2
hibernate创建模式
生成测试源
hbm2ddl
hbm2ddl
注释配置
/src/main/resources/hibernate.cfg.xml
真的
com.soebes.casestudy.bo
假的
create.sql
假的
真的
假的
假的