[gomock] 新しく追加されていたCondが便利だった件
gomockとは?
gomockは、Go言語用のモッキング・フレームワークです。
元々はGoogleのgolang/mockとして開発されていましたが、2023年の6月頃にプロジェクトがアーカイブされ、現在はUber社がフォークして保守しています。
基本的な使い方はこちらの記事をご参照ください。
本記事ではUber社によってフォークされたのちに追加された便利Matcherのうち、特に活用頻度が高いCond
Matcherについて紹介していきます。
Cond
以外のMatcherについては下記スライドやGithubのreleasesをご参照ください。
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
を活用する必要がありました。
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に新たに追加されたCond
Matcherについて紹介しました。
他にも以下のMatcherが新たに追加されています。
言語・フレームワークなどの影響度の大きいアップデート情報と比べると、各種ライブラリのアップデート情報は目が届きにくいかもしれません。
しかし、本記事で紹介したように、いつの間にか便利な新機能が追加されていることがあります。
生産性を高めるためにも定期的にチェックすることの重要性を再確認しました。
皆さんもこの機会に、活用しているライブラリのアップデート情報をぜひ確認してみてください。
「物流の次を発明する」をミッションに物流のシェアリングプラットフォームを運営する、ハコベル株式会社 開発チームのテックブログです! 【エンジニア積極採用中】t.hacobell.com/blog/career
Discussion