Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking Static Methods

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.

like image 440
Kevin Meredith Avatar asked May 03 '11 01:05

Kevin Meredith


People also ask

Can you mock a static method?

Since static method belongs to the class, there is no way in Mockito to mock static methods.

Can you mock a static class?

Mocking a No Argument Static Method 0, we can use the Mockito. mockStatic(Class<T> classToMock) method to mock invocations to static method calls. This method returns a MockedStatic object for our type, which is a scoped mock object.

Why should we not mock static methods?

If you need to mock a static method, it is a strong indicator for a bad design. Usually, you mock the dependency of your class-under-test. If your class-under-test refers to a static method - like java.


1 Answers

@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.

like image 69
Jeco Avatar answered Sep 17 '22 11:09

Jeco