HobbyLobbyVS
HobbyLobbyVS

Reputation: 91

How to inject depdency while mocking protected method using AutoMock XNnit?

In the below code snippet, I am trying to mock the response of a protected method and test the response of the public method which calls the protected method. The protected method calls an external API, hence I would like to mock the response in order to test the public method which calls the protected method.

The problem arises when I try to inject the dependency on the class which is used by the public method. It always goes to the default constructor ignoring the dependency objects I pass. Please let me know where I am missing the change. Note: I have added the default constructor just to understand the flow. I will not have it in the real implementation.

Test Method

[Fact]
public void Test()
{
    using (var mock = AutoMock.GetLoose())
    {
        Depdency1 depdency1 = new Depdency1();
        Depdency2 depdency2 = new Depdency2();

        var parm1 = new NamedParameter("dependency1", depdency1);
        var parm2 = new NamedParameter("dependency2", depdency2);

        //Mock the protected method
        mock.Mock<SystemUnderTest>(parm1, parm2)
           .Protected()
           .Setup<bool>("IsOrderValid", "TestOrder")
           .Returns(true);

        var sut = mock.Create<SystemUnderTest>();

        sut.ProcessOrder("Test");
    }
}

Main class

public class SystemUnderTest : ISystemUnderTest
{
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;

    public SystemUnderTest()
    {

    }
    public SystemUnderTest(IDependency1 dependency1, IDependency2 dependency2)
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }

    public bool ProcessOrder(string OrderID)
    {
        //Businss logic using dependency1
        if (IsOrderValid(OrderID))
        {

            if (_dependency1 == null)
            {
                throw new AggregateException("Depdency1 is null");
            }
            //Businss logic
            return true;
        }
        else
        {
            if (_dependency1 == null)
            {
                throw new AggregateException("Depdency1 is null");
            }
            //Businss logic
            return false;
        }
    }

    protected virtual bool IsOrderValid(string OrderID)
    {
        //Business logic using dependency2
        if (_dependency2 == null)
        {
            throw new AggregateException("Depdency2 is null");
        }
        return true; //False based on logic
    }
}

public interface IDependency1
{
    void Method1();
}

public interface IDependency2
{
    void Method2();
}

public class Depdency1 : IDependency1
{
    private int _property1;
    public void Method1()
    {
        throw new NotImplementedException();
    }
}
public class Depdency2 : IDependency2
{
    private int _property2;
    public void Method2()
    {
        throw new NotImplementedException();
    }
}

Upvotes: 0

Views: 154

Answers (0)

Related Questions