0

因为我是 Mockito 和 AEM 模型 java 的新手。我浏览了一些文档并为 AEM Model java 编写了我的第一个 Mockito 文件。在我的代码中,我没有看到任何错误,但是在运行时我没有成功并且无法 100% 完成代码覆盖率。任何人都可以纠正/帮助我修复我的代码[给定示例 java 和相应的 mockito 文件]

Java 文件:

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.SlingObject;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.abc.cc.ddd.ResourceResolverService;
import com.abc.cc.ddd.services.models.bean.Accordion;
@Model(adaptables = SlingHttpServletRequest.class)
public class AccordionModel {
    private final static Logger log = LoggerFactory.getLogger(AccordionModel.class);
    @SlingObject
    private SlingHttpServletRequest request;
    @Inject
    public ResourceResolverService resolverService;
    private Resource resource;
    public List < Accordion > accordionList = new ArrayList < Accordion > ();
    @PostConstruct
    protected void init() throws LoginException, JSONException {
        log.info("AccordionModel init method Start");
        resource = request.getResource();
        final ValueMap configurationOptionProperties = resource.getValueMap();
        log.debug("iconfigurationOptionProperties is " + configurationOptionProperties);
        String count = configurationOptionProperties.get("count", String.class);
        if (count != null) {
            for (int i = 1; i <= Integer.valueOf(count); i++) {
                Accordion accordion = new Accordion();
                String title = configurationOptionProperties.get("title" + i, String.class);
                String rte = configurationOptionProperties.get("rte" + i, String.class);
                accordion.setTitle(title);
                accordion.setRte(rte);
                accordionList.add(accordion);
            }
        }
        log.info("AccordionModel init method End");
    }
    public List < Accordion > getAccordionList() {
        return accordionList;
    }
}

模拟代码

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.json.JSONException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import com.abc.cc.ddd.ResourceResolverService;
import com.abc.cc.ddd.services.models.bean.Accordion;
@RunWith(MockitoJUnitRunner.class)
public class AccordionModelTest {
    @InjectMocks
    private AccordionModel accordionModel;
    @Mock
    Resource resource;
    @Mock
    SlingHttpServletRequest request;
    @Mock
    ResourceResolverService resourceResolverService;
    @Mock
    ValueMap valuemap;
    public List < Accordion > accordionList = new ArrayList < Accordion > ();
    String count = "6";
    //max count, based on this count loop execute and get/set into the list  
    @Before
    public void setUp() throws Exception {
        when(request.getResource()).thenReturn(resource);
        when(resource.getValueMap()).thenReturn(valuemap);
    }
    @Test
    public void shouldReturnNullWhenPropertyIsNull() throws LoginException, JSONException {
        when(valuemap.get("count", String.class)).thenReturn(null);
        accordionModel.init();
        assertEquals(accordionModel.getAccordionList(), null);
    }
    @Test
    public void shouldReturnWhenPropertyNotNull() throws LoginException, JSONException {
        when(valuemap.get("count", String.class)).thenReturn("count");
        accordionModel.init();
        assertEquals(accordionModel.getAccordionList(), count);
    }
}

程序显示错误-->accordionModel.init();

    java.lang.NumberFormatException: For input string: "count"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    at com..services.sling.models.AccordionModel.init(AccordionModel.java:44) at   
    com..services.sling.models.AccordionModelTest.
    shouldReturnWhenPropertyNotNull(AccordionModelTest.java:55)

    java.lang.AssertionError: expected:<[]> but was:<null>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at com..services.sling.models.AccordionModelTest.
    shouldReturnNullWhenPropertyIsNull(AccordionModelTest.java:53)
4

1 回答 1

1

java.lang.AssertionError: expected:<[]> but was:<null>

如果您返回null您的列表是空的。所以调整你的测试。考虑重命名方法名称。如果那不是您想要的,您将需要更改您的实现。

@Test
public void shouldReturnNullWhenPropertyIsNull() throws LoginException, JSONException {
    when(valuemap.get("count", String.class)).thenReturn(null);
    accordionModel.init();
    assertTrue(accordionModel.getAccordionList().isEmpty());
}

java.lang.NumberFormatException: For input string: "count"

"count"不能转换成Integer. 尝试改用您的count变量 ( "6")。

您应该检查列表的内容,现在我对其进行了调整以检查列表的大小是否正确。

@Test
public void shouldReturnWhenPropertyNotNull() throws LoginException, JSONException {
    when(valuemap.get("count", String.class)).thenReturn(count);
    accordionModel.init();
    assertEquals(Integer.valueOf(count), accordionModel.getAccordionList().size());
}

请注意,通常断言的参数顺序应该是expectedvs actual

于 2020-01-20T16:12:36.390 回答