エラー CS0122
'MyClass.subProc1(int, int)' はアクセスできない保護レベルになっています
using System;
namespace xUnitPrivateMethod
{
public class MyClass
{
public int Func(int a, int b, int c)
{
int sa = subProc1(a, c);
int sb = subProc2(b, c);
int sc = subProc3(a, b);
return (sa + sb) * sc;
}
private int subProc1(int a, int b)
{
return a + b;
}
private int subProc2(int a, int b)
{
return a * b;
}
private int subProc3(int a, int b)
{
return a - b;
}
}
}
using System;
using Xunit;
using xUnitPrivateMethod;
namespace xUnitPrivateMethodTest
{
public class UnitTestMain
{
[Fact]
public void Test1()
{
MyClass mc = new MyClass();
Assert.Equal(5, mc.Func(1, 2, 3));
}
}
}
Func
メソッドのテストを実行します。using System;
using Xunit;
using xUnitPrivateMethod;
namespace xUnitPrivateMethodTest
{
public class UnitTestMain
{
[Fact]
public void Test1()
{
MyClass mc = new MyClass();
Assert.Equal(5, mc.Func(1, 2, 3));
}
[Fact]
public void Test2()
{
MyClass mc = new MyClass();
Assert.Equal(5, mc.subProc1(1, 2, 3));
}
}
}
using System;
using Xunit;
using xUnitPrivateMethod;
using System.Reflection;
namespace xUnitPrivateMethodTest
{
public class UnitTestMain
{
[Fact]
public void Test1()
{
MyClass mc = new MyClass();
Assert.Equal(5, mc.Func(1, 2, 3));
}
[Fact]
public void Test2()
{
var obj = Activator.CreateInstance(typeof(MyClass));
MethodInfo method = typeof(MyClass).GetMethod("subProc1", BindingFlags.NonPublic | BindingFlags.Instance);
int result = (int)method.Invoke(obj, new object[] { 1, 2});
Assert.Equal(3, result);
}
}
}
Test3()
メソッドの記述方式でも同様の処理が実装できます。using System;
using Xunit;
using xUnitPrivateMethod;
using System.Reflection;
namespace xUnitPrivateMethodTest
{
public class UnitTestMain
{
[Fact]
public void Test1()
{
MyClass mc = new MyClass();
Assert.Equal(5, mc.Func(1, 2, 3));
}
[Fact]
public void Test3()
{
Type t = typeof(MyClass);
//インスタンス作成
object obj = t.InvokeMember("MyClass", System.Reflection.BindingFlags.CreateInstance, null, null, null);
//メソッド呼び出し作成
int result = (int)t.InvokeMember("subProc1", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, obj, new object[] { 1, 2 });
Assert.Equal(3, result);
}
}
}
BindingFlags.NonPublic
BindingFlags.Instance
を指定すると、
クラスのプライベートメソッドの呼び出しやメソッドオブジェクトの取得ができます。
この機能を利用してテストプロジェクトから、プライベートメソッドの呼び出しができます。