EasyMock Final Method – PowerMock, JUnit 4, TestNG

Filed Under: EasyMock

One of the limitations of EasyMock is that it can’t mock final methods and final classes. However, we can use PowerMock EasyMock extension to mock static methods.

EasyMock Final Method and Class using PowerMock

PowerMock is divided into multiple modules to support JUnit and TestNG testing framework. Similarly, there are modules to extend EasyMock and Mockito mocking frameworks.

I will provide an example to mock final method inside a final class using PowerMock on both JUnit 4 and TestNG frameworks. So we need to import the following artifacts.

  • powermock-module-junit4
  • powermock-module-testng
  • powermock-api-easymock
  • junit, testng and easymock for obvious reasons.

I am not using JUnit 5 because PowerMock doesn’t support it yet. I am using the following versions for my examples.


<junit4.version>4.12</junit4.version>
<testng.version>6.14.3</testng.version>
<powermock.version>2.0.0-beta.5</powermock.version>
<java.version>10</java.version>
<easymock.version>3.6</easymock.version>

JUnit PowerMock EasyMock Final Method Example

  • First step is to annotate test class with @RunWith(PowerMockRunner.class) annotation.
  • Next step is to specify the classes to prepare for testing using PowerMock, for example @PrepareForTest(Data.class). This has to be done at the class level and we can use its fullyQualifiedNames to specify multiple classes and packages.
  • In the test method, use PowerMock.createMock() method to mock the final class.
  • Stub the behaviors using EasyMock.expect() method.
  • Use PowerMock.replay() to finalize the mock object and its behavior setup.
  • Use JUnit 4 asserts to test the behaviors.
  • Use PowerMock.verify() to verify that all the stubbed final methods were called.

Let’s say we have a final class as:


final class Data {
	final String reverse(String s) {
		return new StringBuffer(s).reverse().toString();
	}
}

Here is the JUnit test to mock the final class and its final method and test it.


package com.journaldev.easymock.powermock.finalmethod;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.easymock.PowerMock.*;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.easymock.EasyMock.anyString;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Data.class)
public class JUnit4PowerMockEasyMockFinalExample {

	@Test
	public void test_final_method_class() {
		//PowerMock.createMock()
		Data mock = createMock(Data.class);
		
		expect(mock.reverse("CAT")).andReturn("TAC");
		expect(mock.reverse(anyString())).andReturn("INVALID");
		
		//PowerMock.replay()
		replay(mock);
		
		assertEquals("TAC", mock.reverse("CAT"));
		assertEquals("INVALID", mock.reverse("Java"));
		
		//PowerMock.verify()
		verify(mock);
	}

}

TestNG PowerMock EasyMock Final Method Example

If you want to use TestNG instead of JUnit-4, then make sure your test class extends PowerMockTestCase class. Also remove the @RunWith annotation. Make necessary changes to other annotations and use TestNG assert methods.

Below class uses TestNG along with PowerMock to mock final methods using EasyMock.


package com.journaldev.easymock.powermock.finalmethod;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;

import static org.powermock.api.easymock.PowerMock.*;
import static org.testng.Assert.assertEquals;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.anyString;

@PrepareForTest(Data1.class)
public class TestNGPowerMockEasyMockFinalExample extends PowerMockTestCase{

	@Test
	public void test_final_method_class() {
		//PowerMock.createMock()
		Data1 mock = createMock(Data1.class);
		
		expect(mock.reverse("CAT")).andReturn("TAC");
		expect(mock.reverse(anyString())).andReturn("INVALID");
		
		//PowerMock.replay()
		replay(mock);
		
		assertEquals("TAC", mock.reverse("CAT"));
		assertEquals("INVALID", mock.reverse("Java"));
		
		//PowerMock.verify()
		verify(mock);
	}

}

final class Data1 {
	final String reverse(String s) {
		return new StringBuffer(s).reverse().toString();
	}
}

Summary

PowerMock is a great extension to EasyMock and Mockito mocking frameworks. It helps us to extend our test cases to cover final classes and final methods too.

You can checkout complete project and more EasyMock examples from our GitHub Repository.

Comments

  1. Rahul Kumar says:

    why I’m getting the error? someone please help me
    An error occurred while instantiating class XXXXXXXXXXXXXXX Expecting a stackmap frame at branch target 38
    Reason:
    Expected stackmap frame at this location.
    Bytecode:
    0x0000000: 2a4c 1274 b800 7803 bd00 3a12 79b8 007b
    0x0000010: b800 7f4e 2db2 0081 a500 0e2a 01c0 0083
    0x0000020: b700 85a7 0009 2bb7 0087 0157 b1

  2. Rahul Kumar says:

    Expecting a stackmap frame at branch target 38

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages