如何模拟ATG中的存储库项目



我正在尝试为液滴创建一个Mock类。我能够模拟存储库调用和req.getParameter,但需要关于如何模拟存储库中的存储库项目列表的帮助。下面是示例代码。

for (final RepositoryItem item : skuList) {
    final String skuId = (String) item.getPropertyValue("id");
    final String skuType = (String) item.getPropertyValue("skuType");
    if (this.isLoggingDebug()) {
        this.logDebug("skuType [ " + skuType + " ]");
    }
    final String skuActive = (String) item.getPropertyValue("isActive");
    if EJSD.equalsIgnoreCase(skuType) && (skuActive.equals("1"))) {
        eSkuList.add(item);
        skuCode = (String) item.getPropertyValue(ESTConstants.SKU_MISC1);
        } else (PJPROMIS.equalsIgnoreCase(skuType) && skuId.contains("PP") && (skuActive.equals("1"))) {
        personalSkuList.add(item);
        String tmp = "";
        if (skuId.lastIndexOf("-") > -1) {
            tmp = skuId.substring(skuId.lastIndexOf("-") + 1);
            tmp = tmp.toUpperCase();
            if (this.getDefaultDisplayNameMap() != null) {
                String val = this.getDefaultDisplayNameMap().get(tmp);
                if (StringUtils.isNotEmpty(val)) {
                    displayNameMap.put(skuId, val);
                    } else {
                    val = (String) item.getPropertyValue("displayName");
                    displayNameMap.put(skuId, val);
                }
                } else {
                final String val = (String) item.getPropertyValue("displayName");
                displayNameMap.put(skuId, val);
            }
        }
    }
}

有很多方法可以"模拟"列表。我一直在做这件事,因为我觉得它更可读。

    @Mock private RepositoryItem   skuMockA;
    @Mock private RepositoryItem   skuMockB;
    List<RepositoryItem> skuList = new ArrayList<RepositoryItem>();
    @BeforeMethod(groups = { "unit" })
    public void setup() throws Exception {
        testObj = new YourDropletName();
        MockitoAnnotations.initMocks(this);
        skuList = new ArrayList<RepositoryItem>();
        skuList.add(skuMockA);
        skuList.add(skuMockB);

        Mockito.when(skuMockA.getPropertyValue("id")).thenReturn("skuA");
        Mockito.when(skuMockA.getPropertyValue("skuType")).thenReturn(ActiveSkuDroplet.EJSD);
        Mockito.when(skuMockA.getPropertyValue(ESTConstants.SKU_MISC1)).thenReturn("skuCodeA");
        Mockito.when(skuMockA.getPropertyValue("displayName")).thenReturn("skuADisplayName");
        Mockito.when(skuMockB.getPropertyValue("id")).thenReturn("skuB-PP");
        Mockito.when(skuMockB.getPropertyValue("skuType")).thenReturn(ActiveSkuDroplet.PJPROMIS);
        Mockito.when(skuMockB.getPropertyValue(ESTConstants.SKU_MISC1)).thenReturn("skuCodeB");
        Mockito.when(skuMockB.getPropertyValue("displayName")).thenReturn("skuBDisplayName");
    }

因此,当你在测试中调用它时,它将是这样的:

Mockito.when(someMethodThatReturnsAList).thenReturn(skuList);

所以关键是你不是mockingList,而是List的内容。

使用mockito创建mock是一个不错的选择。但我在这里解释了一种不同的嘲笑存储库项目的方式。

RepositoryItem创建一个通用实现,在测试包中这样说MockRepositoryItemImpl

Public MockRepositoryItemImpl implements RepositoryItem {
    private Map<String, Object> properties;
    MockRepositoryItemImpl(){
        properties = new HashMap<>();
    }
    @override
    public Object getPropertyValue(String propertyName){
        return properties.get(propertyName);
    }
    @override
    public void setPropertyValue(String propertyName, Object propertyValue){
        properties.put(propertyName, propertyValue);
    }
}

使用此实现可以在测试用例中创建mock对象。

RepositoryItem mockSKU = new MockRepositoryItemImpl();
mockSKU.setPropertyValue("id", "sku0001");
mockSKU.setPropertyValue("displayName", "Mock SKU");
mockSKU.setPropertyValue("skuType", "Type1");
mockSKU.setPropertyValue("isActive", "1");

相关内容

  • 没有找到相关文章

最新更新