コード生成なしでモック処理を実現!ovechkin-dm/mockioで学ぶメタプログラミング
構造体(モックオブジェクト)の事前生成が不要
Go-dyno
型パラメータに渡されたインタフェースを満たす構造体を動的に生成
メソッドが実行された場合の挙動を引数に記述できる
インタフェースの型を満たす構造体を動的に生成するフロー
1. インタフェースを満たす構造体を作る
2. 構造体のメソッドテーブルを書き換え、アセンブリで記述した処理に向き先を変える
3. メソッドから関数を呼び出す部分を確認
4. 指定した期待した振る舞いの関数を生成して実行させる
5. メソッドと関数で引数を共有する
reflect.StructOf で構造体を作成し、指定されたインタフェースを埋め込む
reflect.MakeFunc で動的に関数を作成できる
しかし、メソッドは生成できない
∵ レシーバの扱いの難しさ、型安全性
そのため、メソッド内で関数を呼び出し、関数の中身を自由に指定する
が、そんなに簡単ではない
どのインタフェース・メソッドを実行するかは動的に決定される
メソッドは関数にどのような引数を渡せばいいか動的に分岐できない
これを回避するために、メモリ領域をハックして、メソッド呼び出し時の引数を覗き見する