简体   繁体   English

如何使用Powermock模拟静态方法?

[英]How to mock static method using powermock?

public class DownloadBoxHelper extends WCMUsePojo {
private static final Logger log = LoggerFactory.getLogger(DownloadBoxHelper.class);
private ArrayList<Map<String, String>> downloadList;
private ArrayList<Map<String, String>> downloadListFinal;
DownloadBoxModel downloadBoxModel;
@Override
public void activate() throws Exception {
    log.info("Download Box activate Method started");
    JcrUtilService jcrUtil = getSlingScriptHelper().getService(JcrUtilService.class);

    downloadBoxModel = getResource().adaptTo(DownloadBoxModel.class);
    downloadList = downloadBoxModel.getDownloadList();
    downloadListFinal =DHLUtil.getSizeTypeOfAsset(downloadList, getResource(), jcrUtil);
    downloadBoxModel.setDownloadListFinal(downloadListFinal);
    log.info("Download Box activate Method Ended");
}

public DownloadBoxModel getDownloadBoxModel() {

    return downloadBoxModel;
}

} }

I want to mock this helper class. 我想嘲笑这个助手类。 But this helper class have some static method like downloadListFinal =DHLUtil.getSizeTypeOfAsset(downloadList, getResource(), jcrUtil); 但是此帮助程序类具有一些静态方法,如downloadListFinal = DHLUtil.getSizeTypeOfAsset(downloadList,getResource(),jcrUtil);。 This static method refer to DHLUtil.class file. 此静态方法引用DHLUtil.class文件。 Here is declaration 这是宣言

**public static ArrayList<Map<String, String>> getSizeTypeOfAsset(ArrayList<Map<String, String>> downloadList,
        Resource rs, JcrUtilService jcrUtil) {
    log.info("DHLUtil getSizeTypeOfAsset() initiated ");
    ArrayList<Map<String, String>> localDownloadList = new ArrayList<Map<String, String>>();
    Session session = null;
    Node assetMetaNode;
    try {
        session = jcrUtil.getSession(DHLSubService.readservice);
        Iterator<Map<String, String>> it = downloadList.iterator();
        while (it.hasNext()) {
            Map<String, String> mp = it.next();
            if (mp.get(DHLConstants.ASSET_DOWNLOAD_ITEM).toString().contains(".")) {
                assetMetaNode = session.getNode((mp.get(DHLConstants.ASSET_DOWNLOAD_ITEM).toString())
                        + DHLConstants.SLASH + JcrConstants.JCR_CONTENT +DHLConstants.SLASH + DamConstants.ACTIVITY_TYPE_METADATA);
                String assetType = assetMetaNode.getProperty(DamConstants.DC_FORMAT).getString();
                if(assetType!=null){
                    if(assetType.contains("vnd.openxmlformats-officedocument.spreadsheetml.sheet") || assetType.contains("vnd.ms-excel")){
                        assetType="ms-excel";
                    }
                    if(assetType.contains("vnd.openxmlformats-officedocument.wordprocessingml.document") || assetType.contains("msword")){
                        assetType="ms-word";
                    }
                    if(assetType.contains("vnd.openxmlformats-officedocument.presentationml.presentation") || assetType.contains("vnd.ms-powerpoint")){
                        assetType="ms-powerpoint";
                    }

                 }

                Property assetSize = assetMetaNode.getProperty(DamConstants.DAM_SIZE);
                double assetSizeUpdated = 0d;
                DecimalFormat df = new DecimalFormat("0.0");
                String assetSizeType = DHLConstants.BYTE;
                ;
                if (assetSize.getLong() < (1024)) {
                    assetSizeUpdated = (double) assetSize.getLong();
                }
                if (assetSize.getLong() > 1024 && assetSize.getLong() < (1024 * 1024)) {
                    assetSizeType = DHLConstants.KILOBYTE;
                    assetSizeUpdated = (double) assetSize.getLong() / 1024L;
                }
                if (assetSize.getLong() > (1024 * 1024)) {
                    assetSizeType = DHLConstants.MEGABYTE;
                    assetSizeUpdated = ((double) assetSize.getLong() / (1024 * 1024));
                }
                if (assetType.contains("/")) {
                    String strSplit[] = assetType.split("/");
                    assetType = strSplit[1];
                }
                String strMetaData = assetType.toUpperCase() + DHLConstants.SPACE + DHLConstants.LEFT_BRACKET
                        + DHLConstants.SPACE + df.format(assetSizeUpdated) + DHLConstants.SPACE + assetSizeType + DHLConstants.SPACE + DHLConstants.RIGHT_BRACKET;
                mp.put(DamConstants.ACTIVITY_TYPE_METADATA, strMetaData);
                localDownloadList.add(mp);
            }
        }
    }catch (DHLException dhe) {
        log.error("DHLException {}", dhe);
    }catch (Exception e) {
        log.error("Exception {}", e);
    }finally {
        if(null!=session && session.isLive()) {
            session.logout();
        }
    }

    return localDownloadList;
}

So how I mock this? 那我怎么嘲笑呢?

My JUnit file is: 我的JUnit文件是:

**@RunWith(PowerMockRunner.class)
  @PrepareForTes({DownloadBoxHelper.class,DHLUtil.class,DownloadBoxModel.class})

public class DownloadBoxHelperTest extends PowerMockTestCase {
    private DownloadBoxHelper aFinalClass_mock = null;

     @Test
        public void mockFinalClassTest() {
         ArrayList<Map<String, String>> downloadList = new ArrayList<Map<String, String>>();;
         ArrayList<Map<String, String>> downloadListFinal;
         Map<String, String> n = new HashMap<String, String>();
         n.put("a", "a");
         n.put("b", "b");
         downloadList.add(n);

            DownloadBoxModel downloadBoxModel;

            aFinalClass_mock = PowerMockito.mock(DownloadBoxHelper.class);
            Mockito.when(aFinalClass_mock.getSlingScriptHelper()).thenReturn(null);

            // Assert the mocked result is returned from method call
            //Assert.assertEquals(aFinalClass_mock.getSlingScriptHelper()).thenReturn(null);
        }

     @Test
        public void mockFinalClassTest_1() {
         JcrUtilService jcrUtil;s
         ArrayList<Map<String, String>> downloadListFinal;
         Map<String, String> n1 = new HashMap<String, String>();
         n1.put("a", "a");
         n1.put("b", "b");
         downloadListFinal.add(n1);


         Mockito.when(aFinalClass_mock.getDownloadListFinal()).thenReturn(downloadListFinal);
            // Assert the mocked result is returned from method call
            //Assert.assertEquals(aFinalClass_mock.getSizeTypeOfAsset(downloadListFinal, getResource(), jcrUtil);, mockedResult);
        }

Please Provide me solution or one reference JUnit file where we are using [" 请提供解决方案或我们正在使用[“的一个参考JUnit文件

public static ArrayList<Map<String, String>> getSizeTypeOfAsset(ArrayList<Map<String, String>> downloadList,
    Resource rs, JcrUtilService jcrUtil) {
log.info("DHLUtil getSizeTypeOfAsset() initiated "); "  

] this type of class. ]此类。

Thanks 谢谢

you should add: 您应该添加:

PowerMockito.mockStatic(DHLUtil.class); 

and the you can use this method like any other mock: 并且您可以像使用其他任何模拟一样使用此方法:

when(DHLUtil.getSizeTypeOfAsset()).thenReturn(whatever);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM