public interface IExternalInterface
string Text { get; set; }
public class ExternalClass : IExternalInterface
public string Text { get; set; }
public class ClassUnderTest
public void MethodUnderTest(IExternalInterface injected)
Console.WriteLine("The injected class has a Text value of {0}", injected.Text);
public static class ExtensionMethods
public static void CallWithMockedParameter(this object objectUnderTest, string methodName, object valuesForMockedParameter)
var typeUnderTest = objectUnderTest.GetType();
var methodUnderTest = typeUnderTest.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
var parameterUnderTest = methodUnderTest.GetParameters()[0];
var parameterType = parameterUnderTest.ParameterType;
var typeToPass = parameterType.Assembly.GetTypes().Where( a => parameterType.IsAssignableFrom(a) && a.IsClass).Single();
var objectToPass = Activator.CreateInstance(typeToPass);
foreach (var propertyToCopy in valuesForMockedParameter.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
typeToPass.GetProperty(propertyToCopy.Name).SetValue(objectToPass, propertyToCopy.GetValue(valuesForMockedParameter));
methodUnderTest.Invoke(objectUnderTest, new[] { objectToPass });
public static void Main()
ClassUnderTest o1 = new ClassUnderTest();
IExternalInterface a1 = new ExternalClass { Text = "Normal" };
var o2 = new ClassUnderTest();
var a2 = new { Text = "Mocked" };
o2.CallWithMockedParameter(nameof(o2.MethodUnderTest), a2);