如何测试使用 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。我的问题是:

  1. 返回null是因为在执行测试时并非所有类型都加载(?)?
  2. 如何克服这个问题?实际上我想测试是否已返回所需的类型。

提前致谢

如何测试使用 Activator.CreateInstance(..) 的方法

通过添加对 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);