Share
Embed
コード生成なしでモック処理を実現! ovenchkin-dm/mockio,go-dynoで学ぶメタプログラミング
GoConference2025の登壇資料です
cf. https://gocon.jp/2025/talks/958503
【参考文献】
github
- https://github.com/ovechkin-dm/mockio
- https://github.com/ovechkin-dm/go-dyno
- https://github.com/karamaru-alpha/playground
SpeakerDeck「モックライブラリアプローチ比較」
- https://speakerdeck.com/karamaru/motukuraiburariapurotibi-jiao
karamaru
September 27, 2025
Transcript
69 slides
-
UJQTϞοΫϥΠϒϥϦੈքʹͨ͘͞Μ͋Δʂ IUUQTTQFBLFSEFDLDPNLBSBNBSVNPUVLVSBJCVSBSJBQVSPUJCJKJBP ɾσϑΝΫτελϯμʔυ ɾFYQFDUܕ҆શͰͳ͍ ɾHPNPDL౿ऻ ɾϞοΫରΛZBNMཧ ɾฦΓͷFYQFDUͷΈܕ҆શ ɾHPNPDL౿ऻ ɾશͯͷFYQFDU͕ܕ҆શ ɾελϒੜʹಛԽ
ϞοΫϥΠϒϥϦͷઃܭΛൺֱ͢Δͷָ͍͠ʂ ؾʹͳΔํࣾษڧձࢿྉΛͥͻ͝Ұಡ͍ͩ͘͞🙇 ϞοΫΦϒδΣΫτͱελϒɾεύΠͷҧ͍ ֶΔͷͰͥͻʂ -
HPEZOP͕ϝιου͖ߏମΛಈతʹੜ͢ΔΈ͘͡ ΠϯλʔϑΣʔεΛຬͨ͢ߏମΛ࡞Δ ߏମͷϝιουςʔϒϧΛॻ͖͑ ɹΞηϯϒϦͰهड़ͨ͠ॲཧʹϝιουͷ͖ઌΛม͑Δ νΣοΫϙΠϯτ ϝιου͔ΒؔΛݺͼग़͢ %ZOBNJDؔͷҾͰࢦఆͨ͠ৼΔ͍Λ͢ΔؔΛੜɾ࣮ߦ νΣοΫϙΠϯτ ϝιουͱؔͰҾΛڞ༗͢ΔͨΊͷτϦοΫʹ͍ͭͯ
ϝιου ؔ ߏମ )FMMP ҾlLBSBNBSVz Ҿͳ͠ %ZOBNJD͕ؔݺΕͨΒʜ -
HPEZOPʹΑΔϝλϓϩάϥϛϯά ʙߏମͷੜͱϝιου͖ઌมߋʙ ϝιου ߏମ ίʔυੜܕͷϞοΫϥΠϒϥϦͷΈ NPDLJPͷհ HPEZOPʹΑΔϝλϓϩάϥϛϯά ɹɾઃܭ֓ཁ ɹɾߏମͷੜͱϝιου͖ઌมߋ ɹɾؔͷੜͱϝιου͔Βͷݺͼग़͠
ɹɾ͕ؔϝιουͱҾΛڞ༗͢ΔτϦοΫ )FMMP ҾlLBSBNBSVz -
UJQTͦͦϝιουͷॲཧͬͯͲ͜ఆٛ͞Ε͍ͯΔʁ HPTSDJOUFSOBMBCJUZQFHP ɾߏମʮTUSVDU5ZQF6ODPNNPOʯͰද͞ΕΔ ɾʮ6ODPNNPO5ZQF.PGGʯͰϝιουใྻͷ։࢝ҐஔΛಛఆ ɾʮ.FUIPE*GO5GOʯͰ࣮ࡍʹݺͼग़͞ΕΔؔΞυϨεʹ౸ୡ͢Δ TUSVDU5ZQF6ODPNNPO 4USVDU5ZQF 6ODPNNPO5ZQF .FUIPE .FUIPE
<>.FUIPEʢϝιουใྻʣ NP f ɾ ɾ ɾ *GO 5GO ຊςΩετσΟϨΫςΟϒ͔ΒΦϑηοτܭࢉ ࣮ࡍʹݺͼग़͞ΕΔॲཧ -
ੜͨ͠ߏମͷϝιου͕ݺΕͨ࣌ͷॲཧΛࢦఆ͢Δ४උฤ HPEZOPQSPYZQSPYZHP ɾੜͨ͠ߏମΛʮTUSVDU5ZQF6ODPNNPOʯʹΩϟετ ɾ.FUIPEςʔϒϧྻͷҐஔΛׂΓग़͢ NFUIPE1US ࣮ࡍʹݺͼग़͞ΕΔॲཧ TUSVDU5ZQF6ODPNNPO 4USVDU5ZQF 6ODPNNPO5ZQF .FUIPE
.FUIPE <>.FUIPE NP f ɾ ɾ ɾ *GO 5GO ຊςΩετσΟϨΫςΟϒ͔ΒΦϑηοτܭࢉ 6OTBGF1PJOUFSͰJOUFSOBMͳߏऔಘͰ͖Δʂ ͜ΕͰϝιουςʔϒϧΛϝϞϦվม͢Δ४උྃͩʂ -
ੜͨ͠ߏମͷϝιου͕ݺΕͨ࣌ͷॲཧΛࢦఆ͢ΔࢀরΓସ͑ฤ ɾΞηϯϒϦͰఆٛ͞ΕͨॲཧΛࣄલʹࢁੜ͓ͯ͘͠ʢ༰ޙड़ʣ ɾߏମͷϝιου͕ݺͼग़͞Εͨ࣌ɺͦΕΛ࣮ߦ͢ΔΑ͏ʹϝϞϦΛվม͢Δ ࣮ࡍʹݺͼग़͞ΕΔॲཧ NBLF'VOD4UVC TUSVDU5ZQF6ODPNNPO 4USVDU5ZQF 6ODPNNPO5ZQF .FUIPE .FUIPE
<>.FUIPE NP f ɾ ɾ ɾ *GO 5GO ຊςΩετσΟϨΫςΟϒ͔ΒΦϑηοτܭࢉ ࣮ࡍʹݺͼग़͞ΕΔॲཧ NBLF'VOD4UVC HPEZOPQSPYZQSPYZHP HPEZOPQSPYZHFOHP -
HPEZOPʹΑΔϝλϓϩάϥϛϯά ʙؔͷੜͱϝιου͔Βͷݺͼग़͠ʙ ϝιου ؔ ߏମ Ҿ ίʔυੜܕͷϞοΫϥΠϒϥϦͷΈ NPDLJPͷհ HPEZOPʹΑΔϝλϓϩάϥϛϯά ɹɾઃܭ֓ཁ
ɹɾߏମͷੜͱϝιου͖ઌมߋ ɹɾؔͷੜͱϝιου͔Βͷݺͼग़͠ ɹɾ͕ؔϝιουͱҾΛڞ༗͢ΔτϦοΫ ͓Α͏ͬͯݴ͍͍ͨΆΑʂ -
UJQTϨδελͱϝϞϦɺελοΫϑϨʔϜʹ͍ͭͯ ओͳهԱྖҬ$16ͱϝϞϦͷͭ ϝϞϦͷ༰Λ$16͕ಡΈऔΓɺԋࢉͯ͠ϝϞϦΛ্ॻ͖͢Δ $16 ϝϞϦ UFYU໋ྩηοτ TUBDL ϥΠϑαΠΫϧ͕੩తͳσʔλΛׂΓͯΔྖҬ EBUBॳظԽࡁΈάϩʔόϧม CTTະॳظԽάϩʔόϧม
IFBQ ϥΠϑαΠΫϧ͕ಈతͳσʔλΛׂΓͯΔྖҬ ($͕আ͢Δͱ͜Ζ ԾϝϞϦۭؒ Ϩδελ "9 Ϩδελ #9 ʜ ʜ ҐΞυϨε ߴҐΞυϨε ۭ͖ྖҬ ؔͷݺͼग़࣌͠ɺελοΫʹελοΫϑϨʔϜ͕ੵ·ΕΔɻ ελοΫϑϨʔϜͷج४ΛϑϨʔϜϙΠϯλʢ'1ʣͱ͍͏ɻ MPDBMWBSJBCMFϩʔΧϧม HPTSDSVOUJNFTUBDLHP ελοΫϑϨʔϜ '1 'SBNF1PJOUFS 41 4UBDL1PJOUFS BSHTGSPNDBMMFSҾ SFUVSOBEESFTTؔऴྃ࣌ͷδϟϯϓઌ DBMMFS`T#1ؔऴྃ࣌ 41'1ΛͲ͜ʹͤ͞Δ͔ -
HPEZOPͷϝιου͖ߏମΛ࡞͢Δ࡞ઓͦΜͳ؆୯ͳͰͳ͍ʢ࠶ܝʣ ϝιου੩తͳॲཧͰ͋Δඞཁ͕͋Δ ؔʹͲͷΑ͏ͳҾΛ͍͍͔ͤಈతʹذͰ͖ͳ͍ ˠৗʹҾͳ͠ͰؔΛݺͼग़͢ ϝιου ؔ ߏମ )FMMP ҾlLBSBNBSVz ͨͩؔΛݺͼग़͚ͩ͢Ͱ
ɹҾͷड͚͠ʹରԠ͍ͯ͠ͳ͍ϩϘʜ Ҿͳ͠ ҾΑͤ͜ΆΑʂ Կ͔ΛΞϩέʔγϣϯͨ͠ΓɺҾ͖ͨ͠Γ͢ΔϩδοΫͳ͍ ͨͩؔΛΩοΫ͢Δ͚ͩ HPEZOPQSPYZBTN@BNET -
UJQTؔͱϝιουʹ͓͚ΔϨδελঢ়ଶͷྨࣅ ʜ ؔͱϝιουͷϨδελঢ়ଶΛݟൺΔͱͱͯࣅ͍ͯΔ ࠩϨδελͷͭʹϨγʔόʔܕ͕͋Δ͔Ͳ͏͔ $16 Ϩδελ"9 ҾB Ϩδελ#9 ҾC ʜ
$16 Ϩδελ"9 ϨγʔόʔU Ϩδελ#9 ҾB Ϩδελ$9 ҾC IUUQTHJUIVCDPNLBSBNBSVBMQIBQMBZHSPVOECMPCNBJOHPEZOP3&"%.&NEGVODUJPOT IUUQTHJUIVCDPNLBSBNBSVBMQIBQMBZHSPVOECMPCNBJOHPEZOP3&"%.&NENFUIPET ؔ ϝιου -
GPPͷελοΫϑϨʔϜ JOUܕϨδελɺྻܕελοΫอଘ͞ΕΔ GPP͔ΒCBSҾͷൖ͕ྃ͢Δ $16 #BSͷୈҾ BSS<>\^ Ϩδελ"9 ୈҾ OVN ϝϞϦ
ελοΫʣ UJQTؔΛލ͍ͩҾͷड͚͠ʹ͍ͭͯ -
GPPͷελοΫϑϨʔϜ CBS࣮ߦ࣌ɺ৽ͨʹελοΫϑϨʔϜ͕ੵ·ΕΔɻ CBSϨδελ"9ʹୈҾ͕ɺ'1ʹୈҾ͕͋Δ͜ͱΛ৴ͯ͡ಈ࡞͢Δ $16 Ϩδελ"9 ୈҾ OVN #BSͷୈҾ BSS<>\^ CBSͷελοΫϑϨʔϜ
'1 'SBNF1PJOUFS ϝϞϦ ελοΫʣ UJQTؔΛލ͍ͩҾͷड͚͠ʹ͍ͭͯ -
JOUͱJOUྻͷҾΛ࣋ͭEZOBNJD'PP#BSΛߟ͑Δ ·ͣɺΞηϯϒϦͰ࡞͞Εͨϝιουݺͼग़͕࣮͠ߦ͞ΕΔ ϨγʔόʔͱJOUҾϨδελʹɺྻҾελοΫʹஔ͞ΕΔ EZOBNJD'PP#BSʢϝιουʣ ͷελοΫϑϨʔϜ CZUFT $16 EZOBNJD'PP#BSͷୈҾ BSS<>\^ Ϩδελ#9
EZOBNJD'PP#BSͷୈҾ OVN Ϩδελ"9 SFDFJWFSEZOBNJD'PP ϝϞϦ ελοΫʣ ϝιου ߏମ #BS ҾOVN BSS ϝιου͔ΒؔʹҾͤͳ͍ɻͲͷΑ͏ʹࢀর͢Δʁ -
EZOBNJD'PP#BSʢϝιουʣ ͷελοΫϑϨʔϜ CZUFT $16 EZOBNJD'PP#BSͷୈҾ BSS<>\^ EZOBNJD'PP.FUIPET<>ʢؔʣ ͷελοΫϑϨʔϜ ϝϞϦ ελοΫʣ
Ϩδελ#9 EZOBNJD'PP#BSͷୈҾ OVN Ϩδελ"9 SFDFJWFSEZOBNJD'PP ɾϝιουˠؔͷݺͼग़͠Λߟ͑Δɻ ɾϝιουؔʹҾΛͤͳ͍ ɾ݁ՌɺελοΫϑϨʔϜ࿈ଓ͢ΔܗʹͳΔ ϝιου ؔ Ҿͳ͠ ຊདྷ͜͜ʹҾΛΞϩέʔγϣϯͯ͠ൖͯ͠ཉ͍͠ˠ ϝιου͔ΒؔʹҾͤͳ͍ɻͲͷΑ͏ʹࢀর͢Δʁ -
EZOBNJD'PP#BSʢϝιουʣ ͷελοΫϑϨʔϜ CZUFT $16 EZOBNJD'PP#BSͷୈҾ BSS<>\^ EZOBNJD'PP.FUIPET<>ʢؔʣ ͷελοΫϑϨʔϜ ɾ͜ͷঢ়ଶͰؔΛ࣮ߦ͢ΔͱɺҾ͕ਖ਼ৗʹऔಘͰ͖ͳ͍ ɾ͍͍ײ͡ʹϝιουݺͼग़࣌͠ͷҾΛ͖ݟ͍ͨ͠Μ͚ͩͲʜ
'1 'SBNF1PJOUFS ˠͲ͏ʹ͔ͯ͠OVN͕Ϩδελ#9ΛɺBSS͕'1 Λࢀর͢ΔΑ͏ʹͰ͖ͳ͍͔ʁ ͜ΕΛεΩοϓ͍ͨ͠ ͜͜ΛεΩοϓ͍ͨ͠ ϝϞϦ ελοΫʣ Ϩδελ#9 EZOBNJD'PP#BSͷୈҾ OVN Ϩδελ"9 SFDFJWFSEZOBNJD'PP OVNϨδελ"9ʹɺBSS'1 ʹ͋ΔͱࢥͬͯΔ͚Ͳɺ࣮ࡍͦ͏͡Όͳ͍Έ͍ͨΆΑʜ ϝιου͔ΒؔʹҾͤͳ͍ɻͲͷΑ͏ʹࢀর͢Δʁ -
EZOBNJD'PP#BSʢϝιουʣ ͷελοΫϑϨʔϜ CZUFT $16 EZOBNJD'PP#BSͷୈҾ BSS<>\^ EZOBNJD'PP.FUIPET<>ʢؔʣ ͷελοΫϑϨʔϜ ؔʹࢀর͠ͳ͍ҾΛ༨ʹͭ͢ ɾୈҾʹJOUΛՃɻϨδελ"9ΛεΩοϓ
ɾୈҾʹ<>JOUΛՃɺελοΫΛόΠτεΩοϓ '1 'SBNF1PJOUFS '1 Ϩδελ"9ΛεΩοϓ ελοΫΛόΠτεΩοϓ ϝϞϦ ελοΫʣ ୈҾ͔ΒҾ͕ਖ਼ৗʹࢀরͰ͖ΔΑ͏ʹͳͬͨΆΑʂʂʂ👏 ୈҾҎ߱ɺ͕ؔϝιουͱҾΛڞ༗͢Δ͜ͱʹޭʂ👏 Ϩδελ#9 EZOBNJD'PP#BSͷୈҾ OVN Ϩδελ"9 SFDFJWFSEZOBNJD'PP ϝιου͔ΒؔʹҾͤͳ͍ɻͲͷΑ͏ʹࢀর͢Δʁ -
HPEZOPͷΈ·ͱΊ ΠϯλʔϑΣʔεΛຬͨ͢ߏମΛ࡞Δ ߏମͷϝιουςʔϒϧΛॻ͖͑ ɹΞηϯϒϦͰهड़ͨ͠ॲཧʹ͖ઌΛม͑Δ ϝιου͔ΒؔΛݺͼग़͢෦Λ֬ೝ ࢦఆͨ͠ظͨ͠ৼΔ·͍ͷؔΛੜ࣮ͯ͠ߦͤ͞Δ ϝιουͱؔͰҾΛڞ༗͢Δ ϝιου ؔ
ߏମ Ҿ Ҿͳ͠ ˠෆՄೳͱࢥΘΕ͍ͯͨϝιουͷಈతڍಈࢦఆΛࠇຐज़Ͱ࣮ݱ͔͍͍ͯͯͬ͜͠ʂ