1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-26

目的

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です!

1
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?