如何测试使用 Activator.CreateInstance(..) 的方法
本文关键字:Activator CreateInstance 方法 测试 何测试 | 更新日期: 2023-09-27 18:35:45
我正在为以下方法编写一个测试:
public IAnInterface Instantiator()
{
var type = Type.GetType(A_CONSTANT_STRING);
return (IAnInterface)Activator.CreateInstance(type);
}
当测试正在运行时,从 Type.GetType(...)
方法获取的类型为 null。我的问题是:
- 返回
null
是因为在执行测试时并非所有类型都加载(?)? - 如何克服这个问题?实际上我想测试是否已返回所需的类型。
提前致谢
通过添加对 A_CONSTANT_STRING
处指定类型的项目的引用来解决。
如@Krekkon所述,Type.GetType() 方法需要以下字符串:
要获取的类型的程序集限定名称。请参阅程序集限定名称。如果类型位于当前正在执行的程序集或 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。
对于问题 #2:由于对 Type.GetType() 的静态调用,您将无法测试是否已返回类型。如果可以更改代码,则可以引入一个接口,该接口负责类型解析并表示静态 GetType 方法调用的外观:
interface ITypeResolver
{
Type GetType(string typeName);
}
class SomeClass
{
private readonly ITypeResolver typeResolver = ...;
public IAnInterface Instantiator()
{
var type = this.typeResolver.GetType(A_CONSTANT_STRING);
return (IAnInterface)Activator.CreateInstance(type);
}
}
使用接口,您可以模拟ITypeResolver
,还可以在隔离中测试ITypeResolver
接口的实现。
var type = Type.GetType("namespace.qualified.TypeName");
您的类型是在哪个程序集中定义的?假设您的方法与要查找的类型位于同一程序集中,请尝试:
var type = Assembly.GetExecutingAssembly().GetTypes()
.First(t => t.Name == A_CONSTANT_STRING);
return (IAnInterface)Activator.CreateInstance(type);