Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon How do I integrate PowerMock with JUnit 4 to use Mockito's mock-maker-inline


How do I integrate PowerMock with JUnit 4 to use Mockito's mock-maker-inline


Integrating PowerMock with JUnit 4 to use Mockito's `mock-maker-inline` involves several steps. Here's a detailed guide on how to achieve this integration:

Step 1: Add Dependencies

First, you need to add the necessary dependencies to your project. If you're using Maven, include the following in your `pom.xml`:

xml

    
        org.powermock
        powermock-module-junit4
        2.0.9
        test
    
    
        org.powermock
        powermock-api-mockito2
        2.0.9
        test
    
    
        org.mockito
        mockito-core
        5.0.0
        test
    

Note that PowerMock version 2.0.0 and above supports Mockito 2, which is required for using `mock-maker-inline`.

Step 2: Configure Mockito's Mock Maker

To use Mockito's `mock-maker-inline`, you need to configure it. Since Mockito 5.0.0, `mock-maker-inline` is the default, so you don't need to configure it explicitly if you're using this version or newer. However, if you're using an older version, you can enable it by creating a file named `org.mockito.plugins.MockMaker` in the `src/test/resources/mockito-extensions` directory with the following content:


mock-maker-inline

Step 3: Use PowerMock with Mockito

PowerMock provides its own `MockMaker`, which can lead to incompatibility with Mockito's `mock-maker-inline`. However, PowerMock can delegate calls to another `MockMaker`, allowing you to use Mockito's features without conflicts. To use both PowerMock and Mockito together, you can configure PowerMock to use Mockito's `MockMaker` by setting the following property in a file named `org/powermock/extensions/configuration.properties`:


mockito.mock-maker-class=mock-maker-inline

However, this configuration might not be necessary if you're using Mockito 5 or newer, as `mock-maker-inline` is the default.

Step 4: Write Tests with PowerMock and Mockito

To write tests using both PowerMock and Mockito, you need to annotate your test class with `@RunWith(PowerMockRunner.class)` and specify the classes you want to mock using `@PrepareForTest`. Here's an example:

java
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticService.class})
public class RateServiceTest {

    @Test
    public void testMethod() {
        // Mock static methods using PowerMockito
        PowerMockito.mockStatic(StaticService.class);
        // Use Mockito for other mocking needs
        // ...
    }
}

Step 5: Delegating to Another JUnit Runner (Optional)

If you need to use another JUnit runner alongside PowerMock, you can use the `@PowerMockRunnerDelegate` annotation. This is useful for integrating with frameworks like Spring:

java
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@PrepareForTest({StaticService.class})
public class RateServiceTest {

    // Your tests here
}

By following these steps, you can effectively integrate PowerMock with JUnit 4 to leverage Mockito's `mock-maker-inline` capabilities. However, keep in mind that using PowerMock's own `MockMaker` might still cause conflicts with Mockito's inline mock maker, so ensure you configure PowerMock to delegate to Mockito's `MockMaker` if necessary.

Citations:
[1] https://www.codecentric.de/wissens-hub/blog/junit-testing-using-mockito-powermock
[2] https://github.com/powermock/powermock/wiki/mockito
[3] https://www.codecentric.de/knowledge-hub/blog/junit-testing-using-mockito-powermock
[4] https://github.com/powermock/powermock/wiki/powermockagent
[5] https://rieckpil.de/mock-java-constructors-and-their-object-creation-with-mockito/
[6] https://stackoverflow.com/questions/6036450/powermock-mockito-vs-mockito-alone
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.modules.junit4.rule.PowerMockRule
[8] https://davidvlijmincx.com/posts/writing_higher_quality_tests_with_mockitos_inline_mock_maker/
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.plugins.MockMaker