目的
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にアクセスします。
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へアクセスできるようにします。
class MemberSpec extends fixture.FlatSpec with Matchers with AutoRollback {
config.DBs.setup('test)
override def db = NamedDB('test).toDB
...
更に次の行に下記を追加します。
fixtureを定義することで、テスト用DBへ予めテストデータをinsertしておけますので、findのテストを失敗させずにすみます。
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です!