はじめに
今回はUnityのTest Runner
を使って、private
なメソッドもテストしちゃおうという記事になります。
まあ簡単に言うとリフレクションを使ってアクセスするだけではありますが、覚えておいて損はないと思います。
やり方
[Test] public void SampleTest() { var target = new SomeClass(); var setMethod = target.GetType().GetMethod("Execute", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (setMethod != null) { // 実行 var result = (int) setMethod.Invoke(target, new object[] {1, 1}); Assert.That(result, Is.EqualTo(2)); } else { Assert.Fail(); } } public class SomeClass { private int Execute(int x, int y) { return x + y; } }
解説
このコードで一番大切なのはGetType().Getmethod()
の箇所だと思います。
これはObject.GetType()
によりオブジェクトの型情報を取得し、Type.GetMethod
メソッドを利用してprivate
メソッドの情報を取得します。
docs.microsoft.com
docs.microsoft.com
オーバーロードがたくさんありますが、今回用いたものはこちら。
public System.Reflection.MethodInfo? GetMethod (string name, System.Reflection.BindingFlags bindingAttr);
引数 | 意味 |
---|---|
name | 取得するメソッドの名前を格納している文字列。 |
bindingAttr | 検索を実施する方法を指定する列挙値のビットごとの組み合わせ。または null を返す場合は Default。 |
返り値
- 指定した要件と一致するメソッドが存在する場合は、そのメソッドを表すオブジェクト。それ以外の場合は null。
当然BindingFlags
・MethodInfo
ってなんやねんとなると思いますので、ドキュメントを貼っておきます。
docs.microsoft.com
docs.microsoft.com
BindingFlags
は以下の通りです。
バインドおよびリフレクションによるメンバーと型の検索方法を制御するフラグを指定します。
ビットフラグになっているので、複数のフラグを立てられるようになっていることに注意してください。
MethodInfo
は以下のように説明されていました。
メソッドの属性を取得し、メソッドのメタデータにアクセスできるようにします。
最後にMethodInfo.Invoke
を実行して完了です。
public object? Invoke (object? obj, object?[]? parameters);
さいごに
ただprivate
メソッドはクラス外から見た際に普通は触れることができるものではないので、テストをわざわざするのは冗長だとも個人的に思います。
といってもそのプロジェクトの方針などによって一概には言えないと思うので、覚えておく分には悪くないと思います。
ではまた。