Rudziankoŭ
Rudziankoŭ

Reputation: 11251

mockStatic: mock java.lang with PowerMock

I am trying to mock MBeanServer with Mockito, but my attempts fails.

@Test
public void testGetAllCacheProperties() {
    mockStatic(ManagementFactory.class);
    MBeanServer server = MBeanServerFactory.newMBeanServer();
    ObjectInstance inst = server.registerMBean(new MyBeanService(), ObjectName.getInstance(SERVICE_NAME));  
    given(ManagementFactory.getPlatformMBeanServer()).willReturn(server);
}

I suppose to inject my mock into method that normally runs on jBoss AS 7:

@GET
public Response getAllProperties() {
    MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); 

But it fails with exception:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
JmxMBeanServer cannot be returned by getPlatformMBeanServer()
getPlatformMBeanServer() should return MBeanServer 

Update

When I try

 PowerMockito.doReturn(server).when(ManagementFactory.class, "getPlatformMBeanServer");

I get exception:

java.lang.LinkageError: loader constraint violation: when resolving method "java.lang.management.ManagementFactory.getPlatformMBeanServer()Ljavax/management/MBeanServer;" the class loader (instance of org/powermock/core/classloader/MockClassLoader) of the current class, my_package_for_test_class.TestClass, and the class loader (instance of <bootloader>) for the method's defining class, java/lang/management/ManagementFactory, have different Class objects for the type javax/management/MBeanServer used in the signature

Upvotes: 0

Views: 1013

Answers (1)

Rudziankoŭ
Rudziankoŭ

Reputation: 11251

There is not possible to mock static from java.lang package, since PowerMock tries to change bite code and bite code of java.lang classes obviously protected from modifications.

There is work around suggested by Johan Haleby. You have to create wrapper class:

public class JmxUtils {

    public static MBeanServer getPlatformMbeanServer() {
        return ManagementFactory.getPlatformMBeanServer();
    }
}

Then test will look like this

@RunWith(PowerMockRunner.class)
@PrepareForTest(JmxUtils.class)
public class CacheControllerTest {
    //.. preconditions
    given(JmxUtils.getPlatformMbeanServer()).willReturn(server);

Upvotes: 2

Related Questions