ChannelFactory<IService>
を嘲笑するときにTargetInvocationException
がスローされる理由は?コール毎Service
インスタンスを作成するために、並行性の面でより安全だ私には思える原因TargetInvocationException moockでChannelFactoryを
public interface IService
{
void Do();
}
public class Service : IService
{
private ChannelFactory<IRemoteService> factory;
public Service(ChannelFactory<IRemoteService> factory)
{
this.factory = factory;
}
public void Do()
{
using (var remote = factory.CreateChannel())
{
remote.DoRemote();
}
}
}
[TestFixture]
public class ChannelFactoryMoqTest
{
private IService service;
private Mock<ChannelFactory<IRemoteService>> factory;
[Test]
public void Test()
{
this.factory = new Mock<ChannelFactory<IRemoteService>>();
this.service = new Service(this.factory.Object);
// Calling Object on this.factory throws TargetInvocationException
}
}
は私ではなく、単純なIRemoteService
のChannelFactory
依存関係を使用します。ここで
は、例外スタックトレースです:
System.Reflection.TargetInvocationException was unhandled by user code
HResult=-2146232828
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, Object[] args)
at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyInstance(Type proxyType, List`1 proxyArguments, Type classToProxy, Object[] constructorArguments)
at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
at Moq.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
at Moq.Mock`1.<InitializeInstance>b__2()
at Moq.PexProtector.Invoke(Action action)
at Moq.Mock`1.InitializeInstance()
at Moq.Mock`1.OnGetObject()
at Moq.Mock.GetObject()
at Moq.Mock.get_Object()
at Moq.Mock`1.get_Object()
at TR.Eikon.Services.AppVersion.Tests.Workflows.ChannelFactoryMoqTest.Test() in d:\Temp.cs:line 61
InnerException: System.NullReferenceException
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System.ServiceModel
StackTrace:
at System.ServiceModel.ChannelFactory.EnsureSecurityCredentialsManager(ServiceEndpoint endpoint)
at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
at System.ServiceModel.ChannelFactory`1..ctor()
at Castle.Proxies.ChannelFactory`1Proxy..ctor(IInterceptor[])
InnerException:
例外の内容を表示します。クラスが抽象クラスではないため、Moqは実行可能なモックを作成できない可能性が最も高いです。あなたはもっともっと模倣可能な 'IChannelFactory'を使って調べることもできます。 –
Nkosi
@Nkosi私はIChannelFactoryを使用して終了しましたが、CreateChannelと同じシグネチャはありません 例外を見ると、抽象クラスではないもののように見えます。 –
内部例外の直前のスタックトレースを見ると、Moqはデフォルトのコンストラクタを使用してインスタンスを作成しようとしていますが、設定ファイルから取得することを想定して初期化メソッドを呼び出そうとしています。これは、デフォルトのコンストラクタを使用するときに、設定ファイル内の設定を検索するため、予想通りです。 – Nkosi