はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Test Runnerでprivateメソッドもテストしちゃうよ

はじめに

今回は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。


当然BindingFlagsMethodInfoってなんやねんとなると思いますので、ドキュメントを貼っておきます。
docs.microsoft.com
docs.microsoft.com

BindingFlagsは以下の通りです。

バインドおよびリフレクションによるメンバーと型の検索方法を制御するフラグを指定します。

ビットフラグになっているので、複数のフラグを立てられるようになっていることに注意してください。


MethodInfoは以下のように説明されていました。

メソッドの属性を取得し、メソッドのメタデータにアクセスできるようにします。


最後にMethodInfo.Invokeを実行して完了です。

public object? Invoke (object? obj, object?[]? parameters);

さいごに

ただprivateメソッドはクラス外から見た際に普通は触れることができるものではないので、テストをわざわざするのは冗長だとも個人的に思います。

といってもそのプロジェクトの方針などによって一概には言えないと思うので、覚えておく分には悪くないと思います。

ではまた。