2016-09-07 4 views
0

Я пытаюсь высмеять MBeanServer с Mockito, но мои попытки не удались.mockStatic: mock java.lang с PowerMock

@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); 
} 

я предполагаю, чтобы придать свой макет в метод, который обычно работает на jBoss AS 7:

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

Но он терпит неудачу с исключением:

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

Update

Когда я пытаюсь

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

я получаю исключение:

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 

ответ

1

Существует не представляется возможным издеваться статической из java.lang пакета, поскольку PowerMock пытается изменить код укуса и укусить код из java.lang классов очевидно защищаемых от изменений.

Существует работа, предложенная Johan Haleby. Вы должны создать класс-оболочку:

public class JmxUtils { 

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

Тогда тест будет выглядеть следующим образом

@RunWith(PowerMockRunner.class) 
@PrepareForTest(JmxUtils.class) 
public class CacheControllerTest { 
    //.. preconditions 
    given(JmxUtils.getPlatformMbeanServer()).willReturn(server); 
Смежные вопросы