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
Release: 2024-12-09 21:38:11
Original
999 people have browsed it

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();}
}
Copy after login

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'
Copy after login

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();
    }
}
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template