您可能希望为测试加载整个 Spring 上下文,但 DataSource除外。对于数据库的东西,看看MockRunner。它有一组很好的模拟 JDBC 类。
在您的 Spring 上下文中(可能通过单独的 xml 文件),将您的真实 DataSource 替换为 aMockDataSource
以进行测试。从测试用例的上下文中检索此 DataSource,您可以执行以下操作:
MockResultSet rs = new MockResultSet("SELECT 1");
rs.addRow(new Object[] { 1 });
MockConnection con = new MockConnection();
con.getPreparedStatementResultSetHandler().prepareResultSet("SELECT 1", rs);
PreparedStatement ps = connection.prepareStatement("SELECT 1");
ps.executeQuery()
请注意,如果您想抛出异常,结果集处理程序 (via AbstractResultSetHandler
) 有一个prepareThrowsSQLException()
可用于指定特定 SQL 字符串应抛出异常的方法。
根据您在每个测试用例之前需要设置的内容,将上述方法与@Before
和方法混合并匹配。@BeforeClass
请注意,Mock JDBC 语句会记录所有已执行的 SQL,因此如果您正在运行大量 JDBC 调用(数百万?),内存/性能可能会成为问题。为每个测试用例创建一个新的连接/语句可能是最简单的。
最后,如果您使用 Maven,MockRunner 会引入许多其他 JDBC 模拟不需要的东西。这是我在 pom.xml 中定义它的方式:
<dependency>
<groupId>com.mockrunner</groupId>
<artifactId>mockrunner-jdk1.5-j2ee1.3</artifactId>
<version>0.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
<exclusion>
<groupId>cglib-nodep</groupId>
<artifactId>cglib-nodep</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-jee</artifactId>
</exclusion>
<exclusion>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
</exclusion>
<exclusion>
<groupId>org.mockejb</groupId>
<artifactId>mockejb</artifactId>
</exclusion>
<exclusion>
<groupId>nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</exclusion>
<exclusion>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
</exclusion>
<exclusion>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
</exclusion>
<exclusion>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>