[英]Why the method uses Activator.CreateInstance instead of directly "new Class()"?
[英]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。 我的問題是:
null
是因為執行測試時並非所有類型都已加載(?)? 提前致謝
正如@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.