Как имитировать элементы репозитория в 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);
            }
        }

    }
}

person Abhishek    schedule 09.08.2013    source источник
comment
Откуда взялся «skuList»? Простым способом начать это было бы создать пару RepositoryItem, а затем добавить их в список, а затем имитировать отдельные ответы getPropertyValue(String) для каждого из этих RepositoryItem в списке. Также SSCCE не показывает, что вы хотите для проверки на выходе. Это метод service в вашей капле или это служебный метод?   -  person radimpe    schedule 12.08.2013
comment
Радимпе спасибо. Этот метод находится в моем дроплете, а skulist - это список элементов хранилища.   -  person Abhishek    schedule 12.08.2013
comment
Вам нужно создать фиктивные объекты, а затем заглушить каждый вызов. например когда(repositoryItemMock.getRepositoryId(id)).thenReturn(yourSkuId);   -  person Saurabh    schedule 12.08.2013


Ответы (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);

Так что ключ на самом деле в том, что вы не mocking List, а вместо этого содержимое List.

person radimpe    schedule 12.08.2013
comment
Есть одна путаница в коде, которым поделился Абхишек. Существует цикл for, который реализован в Java5. Объявление/назначение RepositoryItem находится внутри цикла. Как мы можем издеваться над этим RepositoryItem?? - person Saurabh; 12.08.2013
comment
@Saurabh Цикл перебирает элементы, существующие в skuList, которые были настроены в @BeforeMethod, поэтому, пока skuList содержит RepositoryItem, он уже будет существовать как ваш «издевательский» RepositoryItem. Вам не нужно издеваться над ним отдельно. - person radimpe; 12.08.2013

Создание макета с помощью mockito — хороший вариант. Но я здесь объясняю другой способ издевательства над элементом репозитория.

Создайте общую реализацию для 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");
person Riju Thomas    schedule 21.07.2016