ユーザーアイコン

mizuko

3か月前

0
0

Go + クリーンアーキテクチャ + mockeryでお手軽テスト戦略(usecase)

Go
mockery

mockeryを使ってmockを自動生成し、お手軽にテストを実装する。

Dockerfileでmockeryをインストールする

RUN go install github.com/vektra/mockery/v2@v2.42.1

Makefileにコマンド定義

mock: docker exec -it paput-api ash -c "mockery --all"

コマンドを実行すると、ルートディレクトリにmockが自動生成される。 以下、簡単な使い方例

package memo import ( "context" "testing" "time" request "github.com/hoge/adapter/http/request/memo" "github.com/hoge/domain/model" "github.com/hoge/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) var ( interactor MemoInteractor mockMemoRepository *mocks.MemoRepository mockCategoryRepository *mocks.CategoryRepository mockUserCategoryRepository *mocks.UserCategoryRepository mockMemoCategoryRepository *mocks.MemoCategoryRepository mockMemoLikeRepository *mocks.MemoLikeRepository mockMemoBookmarkRepository *mocks.MemoBookmarkRepository mockUserLevelService *mocks.UserLevelServiceInterface mockTxRepository *mocks.TxRepository ) func TestMain(m *testing.M) { mockMemoRepository = new(mocks.MemoRepository) mockCategoryRepository = new(mocks.CategoryRepository) mockUserCategoryRepository = new(mocks.UserCategoryRepository) mockMemoCategoryRepository = new(mocks.MemoCategoryRepository) mockMemoLikeRepository = new(mocks.MemoLikeRepository) mockMemoBookmarkRepository = new(mocks.MemoBookmarkRepository) mockUserLevelService = new(mocks.UserLevelServiceInterface) mockTxRepository = new(mocks.TxRepository) interactor = NewMemoInteractor( mockMemoRepository, mockCategoryRepository, mockUserCategoryRepository, mockMemoCategoryRepository, mockMemoLikeRepository, mockMemoBookmarkRepository, mockUserLevelService, mockTxRepository, ) m.Run() } func TestMemoInteractor_GetList(t *testing.T) { memos := []model.Memo{{ID: 1, UserID: 1, Title: "Test Memo", Body: "Test Body", IsPublic: true}} mockMemoRepository.On("GetList", mock.Anything).Return(memos, nil) result, err := interactor.GetList(context.Background()) assert.NoError(t, err) assert.Equal(t, memos, result) mockMemoRepository.AssertExpectations(t) }

On Returnで、お手軽にmockできる。