devlooped/moq · error · ArgumentNullException

value (Argument is null)

Error message

value (Argument is null)

What it means

Moq throws this ArgumentNullException when null is assigned to Mock<T>.DefaultValueProvider. A mock must always have a default value provider to produce return values for loose invocations, so null is rejected immediately.

Solutions

  1. Assign a concrete provider such as DefaultValue.Empty, DefaultValue.Mock, or a custom DefaultValueProvider subclass.
  2. If you intended to reset behavior, create a new mock rather than setting the provider to null.
  3. Null-check the value returned by your provider factory before assigning it.

Example fix

// before
mock.DefaultValueProvider = GetProvider(); // may be null
// after
var provider = GetProvider();
mock.DefaultValueProvider = provider ?? DefaultValue.Empty;
Defensive patterns

Strategy: type-guard

Validate before calling

var provider = GetProvider();
if (provider is null) provider = DefaultValue.Empty;
mock.DefaultValueProvider = provider;

Type guard

bool IsValidProvider(DefaultValueProvider p) => p is not null;

Try / catch

try { mock.DefaultValueProvider = provider; } catch (ArgumentNullException) { mock.DefaultValueProvider = DefaultValue.Empty; }

Prevention

When it happens

Trigger: mock.DefaultValueProvider = null; or passing a null provider variable/return value of a factory into the DefaultValueProvider setter (src/Moq/Mock`1.cs:264).

Common situations: A provider-factory method returning null on a missed configuration branch; conditional config code that nulls out the provider to 'reset' it instead of assigning Mock.Of<DefaultValueProvider> or a concrete provider.

Related errors


AI-assisted analysis of devlooped/moq@89a5be629c (2026-09-16). Data as JSON: /api/errors/ba77634f97122297. Report an issue: GitHub.

Appendix: source

Thrown at src/Moq/Mock`1.cs:264

                    throw new NotSupportedException(Resources.CallBaseCannotBeUsedWithDelegateMocks);
                }

                this.callBase = value;
            }
        }

        internal override object?[] ConstructorArguments => this.constructorArguments;

        internal override Dictionary<Type, object?> ConfiguredDefaultValues => this.configuredDefaultValues;

        /// <summary>
        /// Gets or sets the <see cref="DefaultValueProvider"/> instance that will be used
        /// e. g. to produce default return values for unexpected invocations.
        /// </summary>
        public override DefaultValueProvider DefaultValueProvider
        {
            get => this.defaultValueProvider;
            set => this.defaultValueProvider = value ?? throw new ArgumentNullException(nameof(value));
        }

        internal override EventHandlerCollection EventHandlers => this.eventHandlers;

        internal override List<Type> AdditionalInterfaces => this.additionalInterfaces;

        internal override InvocationCollection MutableInvocations => this.invocations;

        internal override bool IsObjectInitialized => this.instance != null;

        /// <summary>
        ///   Exposes the mocked object instance.
        /// </summary>
        public virtual new T Object
        {
            get { return (T)base.Object; }
        }

View on GitHub (pinned to 89a5be629c)