質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

1回答

3200閲覧

golangのテストで別パッケージから呼び出したメソッドをモックで定義する方法が分かりません

jpskgc

総合スコア19

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2019/09/03 00:19

編集2019/09/03 00:20

前提・実現したいこと

Golangでテストコードを書いています。
現在、service層のテストコードを書いているのですが、dao層から呼び出すメソッドをモックにしたいです。
別パッケージから呼び出すメソッドをモックとして定数を与える方法を教えていただきたいです。

該当のソースコード

フォルダ構成

article ├ client ├ api │ ├ main.go │ ├ contoroller │ │ └ contoroller.go │ ├ service │ │ └ service.go │ ├ dao │ │ └ dao.go │ ├ go.mod │ ├ go.sum │ └ Dockerfile ├ nginx └ docker-compose.yml

service.go

go

1func GetArticleService(db *sql.DB) []util.Article { 2 var articles []util.Article 3 4 //ここのdao.GetArticleDao(db)をモックにしたいです 5 results := dao.GetArticleDao(db) 6 7 article := util.Article{} 8 for results.Next() { 9 err := results.Scan(&article.ID, &article.UUID, &article.TITLE, &article.CONTENT) 10 if err != nil { 11 panic(err.Error()) 12 } else { 13 articles = append(articles, article) 14 } 15 } 16 return articles 17}

service_test.go

go

1func TestGetArticleService(t *testing.T) { 2 //dbのモック 3 db, _, err := sqlmock.New() 4 5 if err != nil { 6 t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) 7 } 8 9 defer db.Close() 10 11 //期待値の作成 12 var expectedArticles []util.Article 13 14 expectedArticle1 := util.Article{ 15 ID: 1, 16 UUID: "bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c", 17 TITLE: "test", 18 CONTENT: "test", 19 } 20 expectedArticles = append(expectedArticles, expectedArticle1) 21 22 expectedArticle2 := util.Article{ 23 ID: 2, 24 UUID: "844bc620-7336-41a3-9cb4-552a0024ff1c", 25 TITLE: "test2", 26 CONTENT: "test2", 27 } 28 expectedArticles = append(expectedArticles, expectedArticle2) 29 30 //期待値とGetArticleServiceが一致するかチェック 31 //GetArticleService(db)を実行するので、dao.GetArticleDao(db)をモックにしたい 32 assert.Equal(t, expectedArticles, GetArticleService(db)) 33}

補足情報(FW/ツールのバージョンなど)

・client: react/axios ・api: golang/gin ・web-server: nginx ・db: mysql ・container: docker ・ci-tool: travis ・deploy: aws elastic beanstalk

以上お手数ですが、ご教授いただけると幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

go

1func GetArticleService(db *sql.DB) []util.Article { 2 var articles []util.Article 3 4 //ここのdao.GetArticleDao(db)をモックにしたいです 5 results := dao.GetArticleDao(db)

いきなり呼び出すのではなく引数として注入するようにします。

go

1// DAO関数の型がわからないので適当 2func GetArticleService(getArticleDao func() []Result) []util.Article { 3 results := getArticle()

こうしておけばテスト時に簡単に差し替えできます。

func TestGetArticleService(t *testing.T) { // 決まった値を返すダミー関数 dummyFunc := func () []Result { return []Result{Result{}} } // ダミー関数を注入 results := GetArticleService(dummyFunc)

もしくは関数そのものでなく関数を持つ interface を定義してそれを差し替えるという方法も考えられます。

さらに詳しい手法はDI 依存性注入 で調べてみて下さい。

投稿2019/09/03 01:54

編集2019/09/03 01:57
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問