簡體   English   中英

如何測試使用Activator.CreateInstance(…)的方法?

[英]How to test a method that uses Activator.CreateInstance(…)?

我正在為以下方法編寫測試:

public IAnInterface Instantiator()
{
    var type = Type.GetType(A_CONSTANT_STRING);
    return (IAnInterface)Activator.CreateInstance(type);
}

運行測試時,從Type.GetType(...)方法獲得的類型為null。 我的問題是:

  1. 返回null是因為執行測試時並非所有類型都已加載(?)?
  2. 如何克服這個問題? 實際上,我想測試是否已返回所需的類型。

提前致謝

正如@Krekkon已經提到的那樣, Type.GetType()方法需要以下字符串:

要獲取的類型的程序集限定名稱。 請參閱AssemblyQualifiedName。 如果類型在當前正在執行的程序集中或在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 ,也可以在Isolation中測試ITypeResolver接口的實現。

var type = Type.GetType("namespace.qualified.TypeName");

通過添加對在A_CONSTANT_STRING指定的類型所在的項目的引用來解決。

您的類型定義在哪個程序集中? 假設您的方法與要查找的類型在同一程序集中,請嘗試:

var type = Assembly.GetExecutingAssembly().GetTypes()
    .First(t => t.Name == A_CONSTANT_STRING);

return (IAnInterface)Activator.CreateInstance(type);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM