Home >Java >javaTutorial >How Can I Mock Final Classes in Java Using Mockito?

How Can I Mock Final Classes in Java Using Mockito?

Susan Sarandon
Susan SarandonOriginal
2024-12-09 21:38:11945browse

How Can I Mock Final Classes in Java Using Mockito?

Mocking Final Classes with Mockito

In the realm of Java testing, mocking non-final classes is a common practice to isolate dependencies and test code in a controlled environment. However, final classes pose a distinct challenge when it comes to mocking.

For instance, let's consider the following example:

public final class RainOnTrees {
   public void startRain() {}
}

public class Seasons {
   RainOnTrees rain = new RainOnTrees();
   public void findSeasonAndRain() {rain.startRain();}
}

In this scenario, we have a final class named RainOnTrees and a class Seasons that depends on it. To test Seasons effectively, we need to mock RainOnTrees. However, mocking final classes is not inherently possible with Mockito version 1.

Mockito Inline to the Rescue

To overcome this limitation, Mockito version 2 introduced the mockito-inline package which allows for mocking static and final classes, including constructors. To utilize this capability, add the following dependency to your Gradle file:

testImplementation 'org.mockito:mockito-inline:2.13.0'

Mocking with Mockito Inline

Once the mockito-inline package is added, mocking final classes becomes straightforward:

@ExtendWith(MockitoExtension.class)
public class SeasonsTest {
    @Mock
    RainOnTrees rainMock;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindSeasonAndRain() {
        Seasons seasons = new Seasons();
        // Inject the mock into the Seasons class
        ReflectionTestUtils.setField(seasons, "rain", rainMock);

        seasons.findSeasonAndRain();

        // Verify that the mocked method was called
        Mockito.verify(rainMock).startRain();
    }
}

Final Notes

It's important to note that mocking final classes should be used judiciously, as it can lead to fragile tests that may fail if the implementation of the final class changes. When possible, creating non-final classes for dependency injection is a preferred approach for testing.

The above is the detailed content of How Can I Mock Final Classes in Java Using Mockito?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn