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できる。