You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUnit中私有方法测试问题:反射调用报TargetException错误

问题原因

你碰到的System.Reflection.TargetException是因为调用私有方法时传错了目标实例:你通过_class.GetType()获取的是Class类的私有方法,这个方法属于_class对象,但你调用Invoke时传的是测试类自身的this,类型不匹配才抛出了异常。

修复代码

只需要把Invoke的第一个参数改成_class就能解决,修复后的完整代码如下:

private Class _class;
private List<Item> _list;
private List<Item> _resultList;

[SetUp]
public void SetUp()
{
    _class = new Class();
    _list = new List<Item>();
    _resultList = new List<Item>();
    // 准备测试数据
}

[Test]
public void TestMethod_Equal()
{
    var method = GetMethod("PrivateMethodName");
    // 关键修改:将this替换为_class,私有方法属于这个实例
    var result = method.Invoke(_class, new object[] { _list }); 
    Assert.That(_resultList, Is.EqualTo(result));
}

private MethodInfo GetMethod(string methodName)
{
    if (string.IsNullOrWhiteSpace(methodName))
        Assert.Fail("methodName cannot be null or whitespace");

    var method = _class.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);

    if (method == null)
        Assert.Fail($"{methodName} method not found");

    return method;
}
补充说明
  • 如果要测试的私有方法是静态方法,需要把BindingFlags.Instance换成BindingFlags.Static,同时Invoke的第一个参数传null
  • 虽然反射能绕过访问权限测试私有方法,但如果经常需要这么做,可能得反思下类的职责划分——这些私有方法是不是应该拆成独立的公共服务类?当然如果只是为了覆盖个别边缘场景的测试,用反射是可以接受的折中方案。

内容的提问来源于stack exchange,提问作者user20510170

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:40:30