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

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

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

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

Q&A

解決済

1回答

8001閲覧

Goのテストで`there are no expected calls of the method "Get" for that receiver`

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

0グッド

0クリップ

投稿2021/06/10 07:14

今、以下のようなGoのコードのテストをgomockを用いて書こうとしています

golang

1type HogeService interface { 2 Fuga() (*model.User, error) 3} 4type hogeServiceImpl struct { 5 UserRepository repository.UserRepository 6} 7 8func NewHogeService( 9 userRepository repository.UserRepository, 10 11) HogeService { 12 return &hogeServiceImpl{ 13 UserRepository: userRepository, 14 } 15} 16 17func (s *hogeServiceImpl) Fuga() (*model.User, error) { 18 (略) 19 user, err := s.UserRepository.Get(userID) 20 (略) 21 return &model.User{ 22 ID: user.ID, 23 }, nil 24}

テスト

golang

1func TestFuga(t *testing.T) { 2 ctrl := gomock.NewController(t) 3 defer ctrl.Finish() 4 userRepository := mock.NewMockUserRepository(ctrl) 5 impl := NewHogeService( 6 userRepository, 7 ) 8 9 t.Run("", func(t *testing.T) { 10 got, err := impl.Fuga() 11 expected := &model.User{ 12 ID: "hogehoge", 13 } 14 assert.Equal(t, expected, got) 15 assert.Equal(t, err, nil) 16 }) 17} 18

このテストを実行すると、以下のようなエラーでコケてしまいます

bash

1$ go test hoge_service.go hoge_service_test.go 2--- FAIL: TestFuga (0.00s) 3 hoge_service.go:89: Unexpected call to *mock_repository.MockUserRepository.Get([hogehoge]) at /path/hoge_service.go:89 because: there are no expected calls of the method "Get" for that receiver 4 --- FAIL: TestFuga/#00 (0.00s) 5 testing.go:1048: test executed panic(nil) or runtime.Goexit: subtest may have called FailNow on a parent test 6FAIL 7FAIL command-line-arguments 0.310s 8FAIL

解決方法をご存知の方がいらっしゃいましたら教えていただきたいです????‍♀️

やったこと

  1. エラー分でググったところ以下のような記事にヒットしましたが、本番コードを呼び出す前にモックを設定しているので問題なさそうでした

https://github.com/golang/mock/issues/260#issuecomment-459513204

  1. mockのGetメソッドに到達していないのかと思いましたが、logを仕込みましたがmockのGetメソッドには到達していました

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

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

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

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

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

guest

回答1

0

ベストアンサー

mock のふるまい定義を、production code を呼び出す前にされていないからではないでしょうか。

mockgen や go generate で mock を作成されていれば、

mockObject.EXPECT().MockFunction().Return(returnValue)

のように、Mock した mockObject の、呼び出したい関数 MockFunction に対して、
期待する戻り値 returnValue を定義をする必要があると思うのですが、
記載されたテストコードでは(mock を生成する部分はありますが、)ふるまい定義を部分がなさそうです。

関連リンクの issue に書かれているのは「Mock の動作の定義はしているが、production code の呼び出しの後に設定しているので、モック定義より後に実行部分を移動させてみて。」という内容かと思います

投稿2021/06/10 20:55

編集2021/06/10 22:08
kiino

総合スコア539

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問