簡體   English   中英

mockStatic:使用PowerMock模擬java.lang

[英]mockStatic: mock java.lang with PowerMock

我正在嘗試使用Mockito模擬MBeanServer ,但是我的嘗試失敗了。

@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 

更新資料

當我嘗試

 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

無法從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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM