使用 H2 DB 来做单元测试
H2 是一款嵌入式数据库。当然它也可以C/S方式运行,但这种方式并不常用,因为Oracle、SQL Server、MySQL等产品在这方面比它强大的多。我们一般喜欢用它来做单元测试,更喜欢把它的数据库放在内存中,因为这样访问速度快,而且每次启动程序得到的数据库都是一致的。
创建内存数据库并使用
@Test
public void useH2() throws ClassNotFoundException, SQLException {
Class.forName("org.h2.Driver");
// 所有数据都存储在内存中,数据库没有名字
String url = "jdbc:h2:mem:";
// 默认的用户名,没有密码
String user = "sa";
String password = "";
Connection conn = DriverManager.getConnection(url, user, password);
Statement statement = conn.createStatement();
// H2的语法和MySQL的语法还是有些差别的,比如KEY `w`,CONSTRAINT `w`
statement.execute("create table test (id char(10) not null)");
ResultSet rs = statement.executeQuery("show tables");
assert rs.next();
assertEquals("TEST", rs.getString(1));
rs = statement.executeQuery("select * from test");
assert !rs.next();
statement.execute("insert into test values ('123')");
rs = statement.executeQuery("select * from test");
assert rs.next();
assertEquals("123", rs.getString(1));
statement.close();
conn.close();
}
可以写个脚本文件,用于创建数据库和填充数据。
在Spring中使用H2 DB(基于注解的配置)
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configurable
public class DbConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
// 用于创建表的sql脚本
.addScript("classpath:conf/sql/schema.sql")
// 用于填充数据的sql脚本
.addScript("classpath:conf/sql/data.sql")
.build();
}
}
JUnit4 测试类
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.mxh.h2.config.DbConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DbConfig.class)
public class MenTest {
@Autowired
private DataSource dataSource;
@Test
public void getConnection() throws SQLException {
dataSource.getConnection();
}
@Test
public void useH2() throws ClassNotFoundException, SQLException {
Class.forName("org.h2.Driver");
String url = "jdbc:h2:mem:";
String user = "sa";
String password = "";
Connection conn = DriverManager.getConnection(url, user, password);
Statement statement = conn.createStatement();
statement.execute("create table test (id char(10) not null)");
ResultSet rs = statement.executeQuery("show tables");
assert rs.next();
assertEquals("TEST", rs.getString(1));
rs = statement.executeQuery("select * from test");
assert !rs.next();
statement.execute("insert into test values ('123')");
rs = statement.executeQuery("select * from test");
assert rs.next();
assertEquals("123", rs.getString(1));
statement.close();
conn.close();
}
@Test
public void useH2WithSpring() throws SQLException {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("show tables");
assert rs.next();
assertEquals("TEST", rs.getString(1));
stmt.close();
conn.close();
}
}
使用Spring来做集成更方便一些,毕竟有些东西人家已经给你写好了。
感觉Spring集成的H2就是专门用来做测试的,其他的功能好像并不支持,连url都没有设置的方法。