Export to GitHub

moq - issue #382

NullReferenceException in Match`1.Matches(Object value)


Posted on Mar 12, 2015 by Massive Monkey

What steps will reproduce the problem?

using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace Testing.Tests { [TestClass] public class Tests { public interface ITest { Task<int> TestMethod(int? i); }

    [TestMethod]
    public async Task MyTest()
    {
        var mock = new Mock&lt;ITest&gt;();

        mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int&gt;()))
            .ReturnsAsync(0);
        mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int?&gt;()))
            .ReturnsAsync(0);

        await mock.Object.TestMethod(null);
    }
}

}

What is the expected output? What do you see instead? The test to pass without a Moq internal exception. A NullReferenceExecption from Moq.

What version of the product are you using? On what operating system? Moq - 4.2.1502.911 .NET - v4.0.20926 Windows 7 Professional SP 1 x64 Visual Studio Professional 2013 - 12.0.31101.00 Update 4

Please provide any additional information below.

This exception provides the following information:

Message: Object reference not set to an instance of an object. StackTrace: at Moq.Match1.Matches(Object value) at Moq.Matchers.Matcher.Matches(Object value) at Moq.MethodCall.Matches(ICallContext call) at Moq.ExtractProxyCall.&lt;&gt;c__DisplayClass1.&lt;HandleIntercept&gt;b__0(IProxyCall c) at System.Linq.Enumerable.LastOrDefault[TSource](IEnumerable1 source, Func2 predicate) at Moq.ExtractProxyCall.HandleIntercept(ICallContext invocation, InterceptorContext ctx, CurrentInterceptContext localctx) at Moq.Interceptor.Intercept(ICallContext invocation) at Moq.Proxy.CastleProxyFactory.Interceptor.Intercept(IInvocation invocation) at Castle.DynamicProxy.AbstractInvocation.Proceed() at Castle.Proxies.ITestProxy.TestMethod(Nullable1 i) at Testing.Tests.<MyTest>d__0.MoveNext() in c:\Code...\Tests.cs:line 31

The follow two code samples work as expected:

[TestMethod] public async Task MyTest() { var mock = new Mock<ITest>();

//mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int&gt;()))
   //  .ReturnsAsync(0);
mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int?&gt;()))
    .ReturnsAsync(0);

await mock.Object.TestMethod(null);

}

[TestMethod] public async Task MyTest() { var mock = new Mock<ITest>();

mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int&gt;()))
    .ReturnsAsync(0);
mock.Setup(m =&gt; m.TestMethod(It.IsAny&lt;int?&gt;()))
    .ReturnsAsync(0);

await mock.Object.TestMethod(0);

}

The issues seems to be a difficulty to evaluate what should be called due to the null passed into the Moq'ed method, as the first setup is for type int and the second is for type int?.

Status: New

Labels:
Type-Defect Priority-Medium