Edited at

MysqlでScalikeJDBC入門2 (テスト編)


目的

mysqlでscalikeJDBCのコード自動生成を行い、テストまで通します。

解説したコード全体はこちら: umeneri/scalikejdbc-example: example for scalikejdbc


テスト用DBの設定

前回からの続きです。

まず、テスト用DBのexample_testを作ります。

以下でログインして、

$ mysql -h 127.0.0.1 -uroot -P 4306

DBを作ります。

> create database example_test;

memberテーブルも作成しておきます。

> use example_test;

> CREATE TABLE member
(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(256) NOT NULL,
description VARCHAR(1000),
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
) ENGINE = 'InnoDB', DEFAULT CHARSET=utf8mb4, ROW_FORMAT=DYNAMIC;

application.confにテスト用DB設定を追加します。

ここではtestという名前のコネクション設定を新たに作っています。 example_testにアクセスします。


src/test/resources/test.conf

db.test.driver="com.mysql.jdbc.Driver"

db.test.url="jdbc:mysql://127.0.0.1:4306/example_test"
db.test.user="root"
db.test.password=""


テストコードの修正

class MemberSpecの行の下に以下を設定し、jdbcでテスト用DBへアクセスできるようにします。


src/test/scala/models/MemberSpec.scala

class MemberSpec extends fixture.FlatSpec with Matchers with AutoRollback {

config.DBs.setup('test)

override def db = NamedDB('test).toDB
...


更に次の行に下記を追加します。

fixtureを定義することで、テスト用DBへ予めテストデータをinsertしておけますので、findのテストを失敗させずにすみます。


src/test/scala/models/MemberSpec.scala

  override def fixture(implicit session: DBSession) {

sql"insert into member values (1, ${"Alice"}, '', current_timestamp, current_timestamp)".update.apply()
sql"insert into member values (2, ${"Bob"}, '', current_timestamp, current_timestamp)".update.apply()
}



create, updateのテストコード修正

そのままだとcreate new recordのテストが失敗します。created_atがnullになっているのが原因なので、修正します。

差分です。

-    val created = Member.create(name = "MyString", createdAt = null, updatedAt = null)

+ val created = Member.create(name = "MyString", createdAt = ZonedDateTime.now(), updatedAt = ZonedDateTime.now())

また、TODOと書かれているsave a recordのテストも修正します。

-    // TODO modify something

- val modified = entity
+ val modified = entity.copy(name = "member1")

最後に、コマンドラインでsbt testを実行してすべて成功すればOKです!