实例化无公开构造函数的Azure SDK类时报缺少0参数构造函数错误
报错原因
你遇到的报错是这类Azure SDK模型类的设计规范导致的:
FacetResult、BlobItem这类类属于Azure服务返回的只读结果模型,SDK设计时就没有开放公开构造函数,目的是避免开发者手动构造出不符合规范的无效实例,这类实例正常场景下只会由Azure SDK在收到服务端返回结果时内部反序列化生成。System.Exception属于通用基础类,设计定位就是允许开发者按需手动构造,所以会公开无参数构造函数,两者的设计目标完全不同。
单元测试的解决方案
你可以用以下两种常用方案构造这类无公开构造函数的类的实例,解决单元测试阻塞问题:
- 反射构造(快速实现)
通过反射调用类的非公开构造函数生成实例,也可以通过反射给只读属性赋值,示例代码:
using System.Reflection; using Azure.Search.Documents.Models; // 获取非公开构造函数 var constructor = typeof(FacetResult).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First(); // 传入构造参数生成实例,参数列表可以通过查看类的元数据获取 var facetResult = (FacetResult)constructor.Invoke(new object[] { 10, "testValue" }); // 如需给只读属性赋值也可以通过反射实现 var valueProp = typeof(FacetResult).GetProperty(nameof(FacetResult.Value), BindingFlags.Instance | BindingFlags.Public); valueProp.SetValue(facetResult, "modifiedValue");
- Mock框架构造(单元测试最佳实践)
用Moq、NSubstitute等单元测试常用的Mock框架生成代理对象,自定义配置需要的属性返回值,以Moq为例:
using Moq; using Azure.Search.Documents.Models; var mockFacetResult = new Mock<FacetResult>(); // 配置属性返回值 mockFacetResult.Setup(f => f.Count).Returns(20); mockFacetResult.Setup(f => f.Value).Returns("testFacet"); // 获得可用的实例 FacetResult result = mockFacetResult.Object;
你也可以根据自己的技术栈选择用JSON反序列化的方式构造实例,只要JSON结构匹配类的定义,.NET的序列化器可以跳过公开构造函数的限制直接生成实例。
内容的提问来源于stack exchange,提问作者finbag
相关产品推荐
相关产品推荐

