❤️‍🔥

[gomock] 新しく追加されていたCondが便利だった件

2024/06/19に公開

gomockとは?

gomockは、Go言語用のモッキング・フレームワークです。
元々はGoogleのgolang/mockとして開発されていましたが、2023年の6月頃にプロジェクトがアーカイブされ、現在はUber社がフォークして保守しています。

基本的な使い方はこちらの記事をご参照ください。
https://zenn.dev/sanpo_shiho/articles/01da627ead98f5

本記事ではUber社によってフォークされたのちに追加された便利Matcherのうち、特に活用頻度が高いCondMatcherについて紹介していきます。
Cond以外のMatcherについては下記スライドやGithubのreleasesをご参照ください。
https://speakerdeck.com/utgwkk/go-conference-2024

Condの使い方

Cond は、モック関数のパラメータとして渡された関数が true を返した場合にマッチするMatherを返します
特にカスタム構造体のフィールドに対してマッチさせたい場合に便利です。

使用例
func main() {
	type user struct {
		id   int
		name string
	}
	u := user{
		id:   1,
		name: "user1",
	}
	gomock.Cond(func(x any) bool { return x.(user).name == "user1" }).Matches(u)        // returns true
	gomock.Cond(func(x any) bool { return x.(user).name == "unknown user" }).Matches(u) // returns false
}

Condを導入するメリット

Condが導入される以前は、複雑なマッチングのユースケースを実現するためにAny()をマッチャーとして渡し、DoAndReturnを活用する必要がありました。

DoAndReturnを用いた例
userMock.EXPECT().Create(gomock.Any()).
	DoAndReturn(func(u user) error {
		a := assert.New(t)
		a.Equal("user1", u.name)
		return nil
	}).
	Times(1)

DoAndReturnは、呼び出しがマッチしたときに実行するアクションを宣言するものであり、この方法は若干の抜け道感があり、複雑さを伴うものでした。
このユースケースにCond Matcherを導入することで、より直感的で可読性の高いテストコードを記述することが可能になりました。

まとめ

本記事ではgomockに新たに追加されたCondMatcherについて紹介しました。
他にも以下のMatcherが新たに追加されています。

言語・フレームワークなどの影響度の大きいアップデート情報と比べると、各種ライブラリのアップデート情報は目が届きにくいかもしれません。
しかし、本記事で紹介したように、いつの間にか便利な新機能が追加されていることがあります。
生産性を高めるためにも定期的にチェックすることの重要性を再確認しました。

皆さんもこの機会に、活用しているライブラリのアップデート情報をぜひ確認してみてください。

Hacobell Developers Blog

Discussion