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

时间:2016-07-22 12:44:08

标签: java junit cq5 aem 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;
}

}

我想模仿这个助手类。但是这个辅助类有一些静态方法,比如 downloadListFinal = DHLUtil.getSizeTypeOfAsset(downloadList,getResource(),jcrUtil); 此静态方法引用DHLUtil.class文件。这是宣言

**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;
}

那我怎么嘲笑这个?

我的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);
        }

请向我提供我们正在使用的解决方案或一个参考JUnit文件[&#34;

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

]这种类。

由于

1 个答案:

答案 0 :(得分:4)

你应该添加:

PowerMockito.mockStatic(DHLUtil.class); 

你可以像任何其他模拟一样使用这个方法:

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