- テストコードの作成で、テスト対象のインスタンスのprivateフィールドの値を検証したい場合があります。
- 対象インスタンスの型を取得し、Type.GetField()でフィールドの定義であるFieldInfoをできます。このオブジェクトのFieldInfo.GetValue([対象インスタンス], [フィールド名])で値を取得できます。
- Type.GetField()を実行する際、適切なフラグも指定しないとフィールド定義を検索できません。
フラグの詳細はリファレンスを参照のこと。 - staticなフィールドを取得する場合、BindingFlags.Instanceではなく、BindingFlags.Staticを指定します。
- フィールドではなくプロパティの値を取得する場合は、Type.GetProperty()を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class PrivateClassTest { [Fact(DisplayName = "privateフィールドの値を検査")] public void Test_InspectPrivateField() { var target = new TargetClass(); target.start(); Assert.True(GetPrivateFieldValue<bool>(target, "_started")); } private static T GetPrivateFieldValue<T>(object target, string fieldName) { var type = target.GetType(); var flags = BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance; var fieldInfo = type.GetField(fieldName, flags) ?? throw new InvalidOperationException($"field not found: {fieldName}"); return (T)fieldInfo.GetValue(target); } } public class TargetClass { private bool _started = false; public void start() { if (_started) throw new InvalidOperationException("already started"); _started = true; // something to do... } public void end() { if (!_started) throw new InvalidOperationException("already end"); _started = false; // something to do... } } |