【问题标题】:How to Mock repository Items in ATG如何在 ATG 中模拟存储库项目
【发布时间】:2013-08-11 02:56:11
【问题描述】:

我正在尝试为 droplet 创建一个 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);
            }
        }

    }
}

【问题讨论】:

  • “skuList”从何而来?开始此操作的一种简单方法是创建一对RepositoryItem,然后将它们添加到列表中,然后针对列表中的每个RepositoryItem 模拟getPropertyValue(String) 的各个响应。 SSCCE 也没有显示你想从输出中测试什么。这是您的液滴中的service 方法还是实用方法?
  • 感谢 radimpe 。这个方法在我的droplet中,skulist是repositoryItems的列表
  • 您需要创建模拟对象,然后存根每个调用。例如when(repositoryItemMock.getRepositoryId("id")).thenReturn(yourSkuId);

标签: java mocking atg atg-droplet


【解决方案1】:

使用 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);
    }
}

使用此实现在您的测试用例中创建模拟对象。

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

【讨论】:

    【解决方案2】:

    有多种方法可以“模拟”列表。我一直在这样做,因为我觉得它更具可读性。

        @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的内容。

    【讨论】:

    • 在 Abhishek 分享的代码中有一处混淆。有一个 Java5 方式的 for 循环。 RepositoryItem 的声明/分配在循环中。我们如何模拟这个 RepositoryItem ??
    • @Saurabh 循环遍历@BeforeMethod 中设置的skuList 中存在的项目,只要skuList 包含RepositoryItem,它就会作为您的'嘲笑'RepositoryItem。你不需要单独模拟它。
    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2012-04-04
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多