/// <inheritdoc cref="IMockedDependencyFactory" />
        public IMockedDependency <T> CreateDecoratedDependency <T>(T decoratee)
            where T : notnull
        {
            Ensures.IsInterface <T>();

            var arrangements = new ArrangementCollection();
            var interceptor  = InterceptorFactory.CreateInterceptorFor(MockBehavior.Partial, arrangements);
            var proxy        = DynamicProxyFactory.CreateDecorator <T>(decoratee, interceptor);

            return(new MockedDependency <T>(arrangements, interceptor, proxy));
        }
        /// <inheritdoc cref="IMockedDependencyFactory" />
        public IMockedDependency CreateDecoratedDependency(Type dependency, object decoratee)
        {
            Ensures.NotNull(dependency, nameof(dependency));
            Ensures.IsInterface(dependency);

            var arrangements         = new ArrangementCollection();
            var interceptor          = InterceptorFactory.CreateInterceptorFor(MockBehavior.Partial, arrangements);
            var proxy                = DynamicProxyFactory.CreateDecorator(dependency, decoratee, interceptor);
            var mockedDependencyType = typeof(MockedDependency <>).MakeGenericType(dependency);
            var instance             = Activator.CreateInstance(mockedDependencyType, new[] { arrangements, interceptor, proxy });

            if (instance is IMockedDependency mockedDependency)
            {
                return(mockedDependency);
            }

            throw new InvalidOperationException("Invalid mocked dependency instance");
        }