DbUnitをやってみる

## はじめに
[EclipseでMavenによるプロジェクト作成からJUnitテストまでをやってみる](https://qiita.com/hirotatsuuu/items/234d1d511382fa1a9542)の続きです。
DbUnitとやらを動かしてみます。

DbUnit公式: http://dbunit.sourceforge.net/

## Mavenの設定ファイルの修正
- pom.xmlに依存ライブラリを追記

```pom.xml
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.46</version>
</dependency>
<dependency>
  <groupId>org.dbunit</groupId>
  <artifactId>dbunit</artifactId>
  <version>2.5.0</version>
</dependency>
```
- 参考
    - https://search.maven.org/#artifactdetails|org.dbunit|dbunit|2.5.4|jar
    - https://search.maven.org/#artifactdetails|mysql|mysql-connector-java|5.1.46|jar

## データベースの作成
```create.ddl
drop database if exists maven_sample;
create database if not exists maven_sample;
connect maven_sample;
drop table if exists fruits;
create table fruits(
id integer primary key,
name varchar(20),
price integer
);
insert into fruits(id, name, price) values (1, 'apple', 120);
insert into fruits(id, name, price) values (2, 'banana', 100);
insert into fruits(id, name, price) values (3, 'orange', 150);
```
## サンプルコードの作成

```FruitsMain.java
package com.example;

import java.util.List;

import com.example.dao.FruitsDao;
import com.example.dto.FruitsDto;

public class FruitsMain {
	public static void main(String[] args) {
		for (FruitsDto fruitsDto: getFruits()) {
			System.out.println(fruitsDto.getId());
			System.out.println(fruitsDto.getName());
			System.out.println(fruitsDto.getPrice());
		}
	}

	public static List<FruitsDto> getFruits () {
		FruitsDao fruitsDao = new FruitsDao();
		List<FruitsDto> fruits = fruitsDao.findAll();
		return fruits;
	}
}
```
```FruitsDao.java
package com.example.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.example.dto.FruitsDto;

public class FruitsDao {

	private static final String DB_URL = "jdbc:mysql://localhost/maven_sample?useSSL=false";
	private static final String DB_USER = "root";
	private static final String DB_PASSWORD = "admin";

	public List<FruitsDto> findAll() {
		try(
			Connection con = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
			Statement st = con.createStatement()
		) {
			ResultSet rs = st.executeQuery("select * from fruits");
			List<FruitsDto> fruitsList = new ArrayList<>();
			while(rs.next()){
				FruitsDto fruitsDto = new FruitsDto();
				fruitsDto.setId(rs.getInt("id"));
				fruitsDto.setName(rs.getString("name"));
				fruitsDto.setPrice(rs.getInt("price"));
				fruitsList.add(fruitsDto);
			}
			return fruitsList;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
```
```FruitsDto.java
package com.example.dto;

public class FruitsDto {

	private int id;
	private String name;
	private int price;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
}
```

## Javaのバージョンを変更（必要がある場合は）
僕の場合、Javaの実行環境（JRE）とJavaのコンパイラー（JDK）のバージョンが1.5であったため、使えないメソッドがあったので修正した


- JDKの修正（Javaのコンパイラー）


```
設定
↓
Java
↓
コンパイラー
↓
プロジェクト固有の設定の構成
↓
対象プロジェクトを選択（maven_sample）
↓
コンパイラー準拠レベルを1.8に修正
```

- JREの修正（Javaの実行環境）

```
対象プロジェクトを選択（maven_sample）
↓
ビルドパス
↓
ビルドパスの構成
↓
ライブラリ
↓
JREシステムライブラリ
↓
実行環境を1.8に修正
```
- 参考
    - https://www.intra-mart.jp/document/library/ebuilder/public/e_builder_setup_guide/texts/jre/index.html

- MavenのコンパイルのJavaバージョンを指定
    - pom.xmlを修正

```pom.xml
<properties>
  <java.version>1.8</java.version>
  <maven.compiler.target>${java.version}</maven.compiler.target>
  <maven.compiler.source>${java.version}</maven.compiler.source>
</properties>
```


## DbUnitによるテストコードを作成
```FruitsDaoTest.java
package com.example.dao;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.io.FileInputStream;
import java.util.List;

import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.junit.Test;

import com.example.dto.FruitsDto;

public class FruitsDaoTest extends DBTestCase {

	public FruitsDaoTest(String name) {
		super(name);
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:mysql://localhost/maven_sample?useSSL=false");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "root");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "admin");
	}

	@Override
	protected IDataSet getDataSet() throws Exception {
		return new FlatXmlDataSetBuilder().build(new FileInputStream("dataset.xml"));
	}

	@Test
	public void test_findAll() throws Exception{
		int expectedRowCount = 3;
		FruitsDao sut = new FruitsDao();
		List<FruitsDto> actual = sut.findAll();
		assertThat(actual.size(), is(expectedRowCount));
	}

}
```
- プロジェクトルート直下にdataset.xmlを作成する

```dataset.xml
<dataset>
	<fruits id="1" name="apple" price="100"/>
	<fruits id="2" name="banana" price="200"/>
	<fruits id="3" name="cherry" price="300"/>
</dataset>
```

## おわりに
なんとかDbUnitを使えました。
難しかった。。。
参考になれば幸いです。
次はMockitoをやってみようと思います。
→ [Mockitoをやってみる](https://qiita.com/hirotatsuuu/items/586e1f2f6bdd408dbafc)