java.lang.NoSuchMethodError: org.mockito.invocation.InvocationFactory.createInvocation(Ljava/lang/Object

java.lang.NoSuchMethodError: org.mockito.invocation.InvocationFactory.createInvocation(Ljava/lang/Object

Java 8

Maven 3.9.

I want to verify is void private method call. I try PowerMock.

pom.xml

  <properties>
        <powermock.version>2.0.2</powermock.version>
    </properties>

  <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <scope>test</scope>
    <version>4.4.0</version>
    </dependency>

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-inline</artifactId>
      <scope>test</scope>
      <version>4.4.0</version>
    </dependency>

    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito2</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
    </dependency>

Here my service class:

public class MyService {

    private String data;

    public MyService(String data) {
        this.data = data;
    }

    public void processData() {
        // Some processing logic
        String message = "Processing data: " + data;
        logEvent(message);
        // More processing logic
    }

    private void logEvent(String message) {
        // In a real scenario, this would log the event
        System.out.println("Logging: " + message);
    }
}

Here my unit test using PowerMock:

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

import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyService.class) // Prepare MyService for bytecode manipulation
public class MyServiceTest {

    @Test
    public void testProcessData_shouldCallLogEvent() throws Exception {
        // Arrange
        String testData = "sampleData";
        MyService service = new MyService(testData);
        MyService spyService = PowerMockito.spy(service); // Create a spy to track private method calls

        // Act
        spyService.processData(); // HERE ERROR!!!

        // Assert
        // Verify that the private method 'logEvent' was called exactly once
        verifyPrivate(spyService, times(1)).invoke("logEvent", "Processing data: sampleData");
    }
}

When I run test testProcessData_shouldCallLogEvent the error is rise:

java.lang.NoSuchMethodError: org.mockito.invocation.InvocationFactory.createInvocation(Ljava/lang/Object;Lorg/mockito/mock/MockCreationSettings;Ljava/lang/reflect/Method;Ljava/util/concurrent/Callable;[Ljava/lang/Object;)Lorg/mockito/invocation/Invocation;

    at com.myproject.handler.MyService.processData(MyService.java:15)
    at com.myproject.handler.MyService.processData(MyService.java:14)
    at com.myproject.handler.MyServiceTest.testProcessData_shouldCallLogEvent(MyServiceTest.java:26)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)

Answer

Help about supported versions:

Read more

This work. Problem was in supported versions.

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <java.version>1.8</java.version>
  <mockito.version>3.12.4</mockito.version>
  <powermock.version>2.0.2</powermock.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
    <version>${mockito.version}</version>
  </dependency>

  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <scope>test</scope>
    <version>${mockito.version}</version>
  </dependency>

  <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
  </dependency>
</dependencies>

Enjoyed this article?

Check out more content on our blog or follow us on social media.

Browse more articles