Unit-testing – How to unit test a class which is just an adapter that logs input and output to a third-party library

adapterloggingunit testing

I have the following (in C#, but the question could also apply to Java):

public interface ILibraryAdapter
{
    string Property1 { get; }
    string Method1(string param1);
    ...
}

public class ThirdPartyLibrary : ILibraryAdapter
{
    private readonly ThirdPartyClass thirdPartyClass;
    private readonly ILog log;

    public ThirdPartyLibrary(ThirdPartyClass thirdPartyClass, ILog log)
    {
        this.thirdPartyClass = thirdPartyClass;
        this.log = log;
    }

    public string Property1
    {
        get
        {
            log.Trace("ThirdPartyClass.get_Property1()");
            var result = thirdPartyClass.Property1;
            log.Trace(string.Format("ThirdPartyClass.get_Property1() returned {0}", result));
            return result;
        }
    }

    public string Method1(string param1)
    {
        log.Trace(string.Format("ThirdPartyClass.Method1({0})", param1));
        var result = thirdPartyClass.Method1(param1);
        log.Trace(string.Format("ThirdPartyClass.Method1({0}) returned {1}", param1, result));
        return result;
    }

    ...
}

where the ... represents more of properties and methods being wrapped and logged (about two dozen total).

The separate calls to the logger in each method are part of the requirements.

How should I unit test this class?

Note: The names of the properties and methods of the third-party class do not always match the names of the properties and methods of ILibraryAdapter.

Best Answer

If I were writing a test for this in Java, I would use a mocking library (like Mockito) and create a mock instance of ThirdPartyClass (and possibly the ILog instance). Then I would create an instance of ThirdPartyLibrary, passing in the mocked objects.

Once you have that, call the methods you want to test, and verify that the interaction with the mocked objects are what you expect.