Mocking Static Methods

Kevin Meredith picture Kevin Meredith · May 3, 2011 · Viewed 79k times · Source

Recently, I've begun to use Moq to unit test. I use Moq to mock out classes that I don't need to test.

How do you typically deal with static methods?

public void foo(string filePath)
{
    File f = StaticClass.GetFile(filePath);
}

How could this static method, StaticClass.GetFile() get mocked?

P.S. I'd appreciate any reading materials you recommend on Moq and Unit Testing.

Answer

Jeco picture Jeco · May 3, 2011

@Pure.Krome: good response but I will add a few details

@Kevin: You have to choose a solution depending on the changes that you can bring to the code.
If you can change it, some dependency injection make the code more testable. If you can't, you need a good isolation.
With free mocking framework (Moq, RhinoMocks, NMock...) you can only mock delegates, interfaces and virtual methods. So, for static, sealed and non-virtual methods you have 3 solutions:

  • TypeMock Isolator (can mock everything but it's expensive)
  • JustMock of Telerik (new comer, less expensive but still not free)
  • Moles of Microsoft (the only free solution for isolation)

I recommend Moles, because it's free, efficient and use lambda expressions like Moq. Just one important detail: Moles provide stubs, not mocks. So you may still use Moq for interface and delegates ;)

Mock: a class that implements an interface and allows the ability to dynamically set the values to return/exceptions to throw from particular methods and provides the ability to check if particular methods have been called/not called.
Stub: Like a mock class, except that it doesn't provide the ability to verify that methods have been called/not called.