使用 H2 DB 来做单元测试

使用 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都没有设置的方法。

上述操作只需引入它的jar包即可。也可以下载它的程序包或是Windows上的安装程序,里面有一个Web控制台和其它的一些功能。

你可能感兴趣的:(Java测试)