GO言語で利用するsqlxのmockの書き方をよく忘れるのでメモ書きします。
概要
// sqlxのBeginモック
mock.ExpectBegin()
// sqlxのBeginがエラーになるモック
mock.ExpectBegin().WillReturnError(errors.New("mocked error"))
// sqlxのCommitモック
mock.ExpectCommit()
// sqlxのCommitがエラーになるモック
mock.ExpectCommit().WillReturnError(errors.New("mocked error"))
// sqlxのロールバックを行うモック
mock.ExpectRollback()
// sqlxのロールバックがエラーになるモック
mock.ExpectRollback().WillReturnError(errors.New("mocked error"))
コード例
package funcExec
import (
"errors"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
)
// funcExec関数のテスト(正常系)
func TestCase_funcExec_Success(t *testing.T) {
conn, mock, _ := NewDB()
// sqlxのBeginモック
mock.ExpectBegin()
// sqlxのCommitモック
mock.ExpectCommit()
// テストを行う関数の実行
actual := funcExec(conn)
// テストした関数のテスト結果判定
expected := true
assert.Equal(t, expected, actual)
}
// funcExec関数のテスト(異常系:Beginエラー)
func TestCase_funcExec_Begin_Error(t *testing.T) {
conn, mock, _ := NewDB()
// sqlxのBeginがエラーになるモック
mock.ExpectBegin().WillReturnError(errors.New("mocked error"))
// テストを行う関数の実行
actual := funcExec(conn)
// テストした関数のテスト結果判定
expected := false
assert.Equal(t, expected, actual)
}
// funcExec関数のテスト(異常系:Rollbackエラー)
func TestCase_funcExec_Rollback_Error(t *testing.T) {
conn, mock, _ := NewDB()
// sqlxのBeginモック
mock.ExpectBegin()
// funcExec内でSQLがエラーになるモックを書く
// sqlxのロールバックがエラーになるモック
mock.ExpectRollback().WillReturnError(errors.New("mocked error"))
// 参考:sqlxのロールバックを行うモック
// mock.ExpectRollback()
// テストを行う関数の実行
actual := funcExec(conn)
// テストした関数のテスト結果判定
expected := false
assert.Equal(t, expected, actual)
}
// go-sqlmockパッケージからsqlmockを生成する関数
func NewDB() (*sqlx.DB, sqlmock.Sqlmock, error) {
driver, mock, err := sqlmock.New()
if err != nil {
return nil, nil, err
}
db := sqlx.NewDb(driver, "sqlmock")
return db, mock, db.Ping()
}