使用Maven + Hibernate + SpringTest框架进行单元测试Demo UnitTestjunitSpring单元测试
程序员文章站
2024-02-14 20:32:46
...
使用Maven + Hibernate + SpringTest框架进行单元测试Demo
之前有同事研究内嵌DB以便提供单元测试所需的数据环境,无果,毕竟难以完全实现各种类型DB的独有特性了。我们采用Mock的方式,进行依赖对象构建。由于系统没有基于依赖注入的进行建构,编写UnitTest很容易成了搭建复杂繁琐的系统环境,背离了“单元”的初衷。我在考虑,采用SpingTest框架为单元测试提供了便利的依赖注入管理设施,使我们从冗余复杂中解放出来。而使用Hibernate对底层持久化进行了屏蔽,很好实现了高层次API单元测试的DB独立性。Maven天生对UnitTest的内建支持,专门搞了个phase叫test,如果真的做到面向接口,测试针对接口,自动化测试也不是不可能。
于是做了一个简单的Demo如下:
Maven管理各种Jar依赖,在这里使用了HsqlDB作为内存DB
Maven POM文件
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>floyd.welsney</groupId> <artifactId>orm-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>jboss-hibernate</id> <url>https://repository.jboss.org/nexus/content/groups/public/</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.2.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.2.6.GA</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.0.6.RELEASE</version> </dependency> </dependencies> </project>
创建Spring管理的上下文
Spring配置文件
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <constructor-arg name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"></constructor-arg> <constructor-arg name="url" value="jdbc:hsqldb:mem:xdb"></constructor-arg> <constructor-arg name="username" value="SA"></constructor-arg> <constructor-arg name="password" value=""></constructor-arg> </bean> <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> <constructor-arg name="dataSource" ref="jdbcDataSource"></constructor-arg> </bean> <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="jdbcDataSource" /> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect hibernate.show_sql=true hibernate.use_sql_comments=true hibernate.format_sql=true </value> </property> <property name="mappingResources"> <list> <value></value> </list> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="hibernateSessionFactory"></property> </bean>
下面是Java Code
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class BaseSpringManagedContextJunitTest { protected final Logger logger = LogManager.getLogger(this.getClass()); @Autowired protected SimpleJdbcTemplate simpleJdbcTemplate; @Autowired protected HibernateTemplate hibernateTemplate; protected final void execSqlScript(String scriptPath) { Resource resource = new ClassPathResource(scriptPath); SimpleJdbcTestUtils.executeSqlScript(simpleJdbcTemplate, resource, false); } @Before public void setUp() { execSqlScript("floyd/welsney/test/sql/schema.sql"); execSqlScript("floyd/welsney/test/sql/data.sql"); logger.debug("hsqldb is setup"); } @After public void tearDown() { execSqlScript("floyd/welsney/test/sql/clear.sql"); logger.debug("hsqldb is tearDown"); } @Test public void testXXXX() { logger.debug("Perform unit test"); } }
说明一下代码,
指定◎ContextConfiguration的Location来加载Spring管理的上下文环境配置文件。
◎Autowired说明需要注入的外部依赖。
◎Before用来加载全新的DB Schma和相应的数据。
◎After清理DB环境的脏数据,以为下一次test准备。
最后执行命令mvn test即可,Eclipse下可以Alt+Shift+X+T运行