public void Should_invoke_method_on_real_instance_and_map_response_params() { // Arrange var routeFinder = Substitute.For <IRpcRouteFinder>(); var instance = Substitute.For <ISomeService>(); var server = new BurrowRpcServerCoordinator <ISomeService>(instance, routeFinder, "queue-connnection-string", "10"); var request = new RpcRequest { Id = Guid.NewGuid(), ResponseAddress = "Address", MethodName = "Search", Params = new Dictionary <string, object> { { "page", (long)1 /* long value will be converted to proper int value */ }, { "query", new SomeMessage { Name = "vantheshark" } } } }; var methodInfo = typeof(ISomeService).GetMethod("Search"); methodMatcher.Match <ISomeService>(request) .Returns(methodInfo); var returnValue = new List <SomeMessage> { new SomeMessage { Money = "$1" }, new SomeMessage { Money = "$1" } }; instance.Search(1, Arg.Is <SomeMessage>(arg => arg.Name == "vantheshark")) .Returns(returnValue); // Action server.Start(); server.HandleMesage(request); // Assert tunnel.Received(1).Publish(Arg.Is <RpcResponse>(arg => arg.Exception == null && arg.ReturnValue == returnValue && arg.ChangedParams["query"] is SomeMessage && 1.Equals(arg.ChangedParams["page"]) && arg.RequestId == request.Id), "Address"); }