はじめに
EclipseでMavenによるプロジェクト作成からJUnitテストまでをやってみるの続きです。
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>
- 参考
データベースの作成
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に修正
-
参考
-
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をやってみる