Search code examples
c#justmock

How to mock a private static inner class?


I'd like to ask a question which bother me a lot...

How can I mock the return value of MyPublicStaticMethod_C?? MyPrivateStaticClass_B is really private and static

public static partial class MyPublicStaticClass_A
{
    private static partial class MyPrivateStaticClass_B
    {
        public static int MyPublicStaticMethod_C(string para)
        {
            //...
        }
        //...
    }
}

Solution

  • You must reference the private type through the reflection API using GetNestedType(). Then you can use the non-public mocking API to arrange the method. Here's a working example:

        public static partial class MyPublicStaticClass_A
        {
            public static int Test(string str)
            {
                return MyPrivateStaticClass_B.MyPublicStaticMethod_C(str);
            }
    
            private static partial class MyPrivateStaticClass_B
            {
                public static int MyPublicStaticMethod_C(string para)
                {
                    return 1;
                }
            }
        }
    
        [TestMethod]
        public void ShouldArrangeInnerPrivateClassMethod()
        {
            var privateType = typeof(MyPublicStaticClass_A).GetNestedType("MyPrivateStaticClass_B", BindingFlags.NonPublic);
            Mock.NonPublic.Arrange<int>(privateType, "MyPublicStaticMethod_C").Returns(5);
            var result = MyPublicStaticClass_A.Test(null);
            Assert.Equal(5, result);
        }
    

    But, yeah, having such code should be a last resort - only if refactoring is impossible or unfeasible.