1. Overview
In this short article, we’ll focus on how to mock final classes and methods – using Mockito.
As with other articles focused on the Mockito framework (like Mockito Verify, Mockito When/Then, and Mockito’s Mock Methods) we’ll use the MyList class shown below as the collaborator in test cases.
We’ll add a new method for this tutorial:
public final class MyList extends AbstractList { final public int finalMethod() { return 0; } }
And we’ll also extend it with a final subclass:
public final class FinalList extends MyList { @Override public int size() { return 1; } }
2. Configure Mockito for Final Methods and Classes
Before Mockito can be used for mocking final classes and methods, it needs to be configured.
We need to add a text file to the project’s src/test/resources/mockito/extensions directory named org.mockito.plugins.MockMaker and add a single line of text:
mock-maker-inline
Mockito checks the extensions directory for configuration files when it is loaded. This file enables the mocking of final methods and classes.
3. Mock a Final Method
Once Mockito is properly configured, a final method can be mocked like any other:
@Test public void whenMockFinalMethodMockWorks() { MyList myList = new MyList(); MyList mock = mock(MyList.class); when(mock.finalMethod()).thenReturn(1); assertNotEquals(mock.finalMethod(), myList.finalMethod()); }
By creating a concrete instance and a mock instance of MyList, we can compare the values returned by both versions of finalMethod() and verify that the mock is called.
4. Mock a Final Class
Mocking a final class is just as easy as mocking any other class:
@Test public void whenMockFinalClassMockWorks() { FinalList finalList = new FinalList(); FinalList mock = mock(FinalList.class); when(mock.size()).thenReturn(2); assertNotEquals(mock.size(), finalList.size()); }
Similar to the test above, we create a concrete instance and a mock instance of our final class, mock a method and verify that the mocked instance behaves differently.
5. Conclusion
In this quick tutorial, we covered how to mock final classes and methods with Mockito by using a Mockito extension.
The full examples, as always, can be found over on GitHub.