2023.10.31  

【GO】sqlxのトランザクション系のmockの書き方

Go    

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()
}

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信