LoginSignup
1
3

More than 5 years have passed since last update.

DbUnitをやってみる

Last updated at Posted at 2018-06-04

はじめに

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に修正
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をやってみる

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3