Using Moq to verify execution of private methods

PianoFighter88 picture PianoFighter88 · Jul 27, 2011 · Viewed 9.7k times · Source

I want to test the following logic (this is obviously a stripped-down version of my method):

public void myPublicMethod(params) {

    if(some_condition)
        privateMethod1();
    else
        privateMethod2();
} 

I have all of the other dependencies in the method mocked out, and I've set this up so that I can guarantee that some_condition is true. What I want to do is verify that my privateMethod1() is called exactly once, and privateMethod2() is not called at all. Is this possible to do with Moq?

Here are some notes on the issue:

  • privateMethod1() and privateMethod2() are within the same class as myPublicMethod, so I can't create a mock object for this class.
  • The bodies of privateMethod1/2 both contain many, many dependencies from the class that contains these and myPublicMethod, so breaking out privateMethod1/2 into their own helper class would be prohibitively time-consuming

Any thoughts? Thanks in advance. I'm willing to accept that this can't be done, but I'd like to know one way or another.

Answer

PatrickSteele picture PatrickSteele · Jul 27, 2011

Don't test private methods. They are private implementation details of the class. You should only test the results of executing public methods. As long as your results come out as expected, you shouldn't care how the result is obtained.

Building tests on private methods will lead to brittle tests that break easily when you refactor private implementations (for performance or other reasons).