Mock Final Classes and Methods with Mockito
1. Overview
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 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
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
@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
@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.