Category Archives: Uncategorized

AutoMockingContainer Unity + RhinoMocks + Singleton lifecycle

This is code for minimal no frills automocking container to automatically mocks the dependencies.

References/Credits:

Mocknity: https://github.com/aBaTaPbl4/Mocknity/tree/master/Mocknity (fully flexible custom implementation)

http://www.thomaslevesque.com/2015/06/14/create-an-auto-mocking-container-with-unity-and-fakeiteasy/

https://lostechies.com/joshuaflanagan/2009/02/04/auto-mocking-explained/

Microsoft Unity Auto Mocking Container?

 

 

Snippet

public class AutoMockingContainer : UnityContainer
    {
        public AutoMockingContainer()
        {
            AddExtension(new AutoMockExtension(this));
        }
 
       
    }
    class AutoMockExtension : UnityContainerExtension
    {
        AutoMockingContainer container;
        public AutoMockExtension(AutoMockingContainer container)
        {
            this.container = container;
        }
        protected override void Initialize()
        {
            Context.Strategies.Add(new AutoMockingBuilderStrategy(container), Microsoft.Practices.Unity.ObjectBuilder.UnityBuildStage.PreCreation);
 
        }
    }
 
    internal class AutoMockingBuilderStrategy : BuilderStrategy
    {
        private AutoMockingContainer container;
        private readonly Dictionary<Type, object> mocks;
        MockRepository repository;
 
        public AutoMockingBuilderStrategy(AutoMockingContainer container)
        {
            this.container = container;
            mocks = new Dictionary<Type, object>();
            repository = new MockRepository();
        }
 
 
 
        public override void PreBuildUp(IBuilderContext context)
        {
            var type = context.OriginalBuildKey.Type;
            if (container.Registrations.Any(r => r.RegisteredType == type))
            {
                return;
            }
 
            if (type.IsInterface || type.IsAbstract)
            {
                context.Existing = GetOrCreateMock(context, type);
            }
        }
 
        private object GetOrCreateMock(IBuilderContext context, Type t)
        {
            if (mocks.ContainsKey(t))
                return mocks[t];
 
            var mock = repository.DynamicMock(t);
            context.PersistentPolicies.Set<ILifetimePolicy>(new ContainerControlledLifetimeManager(), context.BuildKey);
            context.Existing = mock;
            context.BuildComplete = true;
            return mock;
        }
    }