继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

怎么做MYSQL代码的单元测试呢?有个好办法

小强聊架构
关注TA
已关注
手记 40
粉丝 9455
获赞 241

数据库相关单元测试代码怎么做?

对于一个重度耦合系统的数据库DAO部分的单元测试怎么来做呢?Mock? 很难吧,而且你怎么测试出这个SQL写的对还是不对。

下面介绍一个很好的jar,可以实现内存中启动数据库,这样单元测试就简单多了。

添加依赖

<dependency>
    <groupId>ch.vorburger.mariaDB4j</groupId>
    <artifactId>mariaDB4j</artifactId>
    <version>2.2.3</version>
</dependency>

怎么使用呢?

  1. 配置DB
DBConfigurationBuilder configBuilder = DBConfigurationBuilder.newBuilder();
configBuilder.setPort(3306); 
configBuilder.setDataDir("/home/theapp/db"); 
DB db = DB.newEmbeddedDB(configBuilder.build());
  1. 启动DB
db.start();
  1. 准备测试数据
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
db.source("path/to/resource.sql");
  1. 单元测试
@Test
public void testGetType() throws Exception {
		//prepare data
		Connection conn = null;
        try {
            conn = DriverManager.getConnection(getConfig().getURL(getDbName()), "root", "");
            QueryRunner qr = new QueryRunner();
            // Should be able to insert into a table
            qr.update(conn, "INSERT INTO `test` (`id`, `type`,value) VALUES (NULL, 'haha', '300');");
        } finally {
            DbUtils.closeQuietly(conn);
        }
		
		//test
		dao = (DaoImpl) SpringContextUtil.getBean("Dao");
		Map<String, String> typeValueMap = dao.getType();
		String value =  typeValueMap.get("haha");
		Assert.assertEquals("300", value);
		
		//delete data
		try {
            conn = DriverManager.getConnection(getConfig().getURL(getDbName()), "root", "");
            QueryRunner qr = new QueryRunner();
            // Should be able to insert into a table
            qr.update(conn, "delete from `test` where type='haha'");
        } finally {
            DbUtils.closeQuietly(conn);
        }
	}

怎么样,是不是既简单有给力呢。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP