2020/03/24

[golang]本体無しでテストをしたい (1)

golangでは、それなりにテストを行う環境が用意されている。
vscodeなんか使うと、テスト関数のファイル先頭や関数先頭にテスト実行のリンクが出てくるくらいには環境が用意されている。

 

しかし、ハードウェアが絡む場合、実機を使わないようにテストしたい場合がほとんどだろう。
今回のようにPCでそのまま実行できるならよいのかもしれないが、クロスコンパイルで環境がそもそも無かったり、ハードウェアの挙動を指定できなかったりすると、その部分だけ差し替えて実行したいものだ。

スタブとかモックとか言うやつですな。
今まではずっと「スタブ」と呼んでいたのだけど、どうやらモック(mock)という方が正しいらしい。

 

どれが筋のいいやり方なのか分からんので、最初に出てきたものを見てみる。

testingだけで完結するmockを作る #Golang - Qiita
https://qiita.com/maitaketurn/items/2618e9ecd68852a0a83b#%E3%81%BE%E3%81%A8%E3%82%81

んんー、よくわからんぞ?

 

まず、テスト対象の実装
これはわかる。わかるというか、テスト対象というだけだ。
あるとすれば、interfaceを持っていることと、宣言されたTaskInterfaceをメンバに持つ構造体TaskControllerがあるということか。
TaskInterfaceをメンバに持って、どういう効果があるのだろうか。

わからんのは、test側
構造体mockTaskControllerがあるのはいいとして、その先頭がTaskInterfaceだけ書いてある。
これが「ダックタイピング」というやつなのか・・・?

 

そうではないらしい。
ダックタイピングというのは、たぶんC言語でC++のclassっぽい、あるいはclassの継承っぽいことをさせたいときに、とあるアドレスからの相対アドレスにあるデータが期待したデータ配列にさえなっていれば実行できるよ、というようなやつと同じようなやつだろう。
言語としてサポートしているなら、メンバの順番が変わっていてもうまいことやってくれるのかもしれん。

 

どうも、埋め込み(embedding)とかいうらしい。

Go言語の埋め込みについて4つのポイントでまとめた - Qiita
https://qiita.com/momotaro98/items/4f6e2facc40a3f37c3c3

似ているのはここか。
HighJumpRunnerインターフェースがあって、それと関係なくgrasshopper構造体があって、でも(*grasshopper)をreceiverに持つHighJump()関数がある。
そして、*grasshopperを埋め込んだShinJinrui2構造体がある。
ShinJinrui2のインスタンスaShinJinrui2の埋め込みメンバ?にgrasshopperのポインタを設定すると、aShinJinrui2.HighJump()が実行できるようになっている。

 

なんか利点があるのだろうが、今日は頭が回らんのでここまで。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。