- テストコードの作成で、テスト対象のインスタンスのprivateフィールドの値を検証したい場合があります。
- 対象インスタンスの型を取得し、Type.GetField()でフィールドの定義であるFieldInfoをできます。このオブジェクトのFieldInfo.GetValue([対象インスタンス], [フィールド名])で値を取得できます。
- Type.GetField()を実行する際、適切なフラグも指定しないとフィールド定義を検索できません。
フラグの詳細はリファレンスを参照のこと。 - staticなフィールドを取得する場合、BindingFlags.Instanceではなく、BindingFlags.Staticを指定します。
- フィールドではなくプロパティの値を取得する場合は、Type.GetProperty()を使用します。
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...
}
}