即使模拟了列表中的对象,Junit测试列表也将返回null

Du *_*ran 2 java unit-testing junit4 mockito

我正在使用Junit4和Mockito测试一些逻辑。

运行测试方法后,结果是在模拟对象并将其添加到列表时返回对象的空列表。结果列表中应该有一个对象。

我尝试调试测试,但仍然看到结果列表不包含任何对象。以下代码只是为了模拟我拥有的真实代码,但是它们基本上是相同的想法。

这是我要测试的方法:在该方法内部创建了一个新列表,然后进行一些过滤以添加列表中的项目,然后返回结果。

public List<TemplateDto> getTemplates(String name) {
        List<TemplateDto> result = new ArrayList<>();

        result.addAll(
                template.getTemplates().stream().filter(t -> t.getName().equals(name))
                .map(s -> new TemplateDto(s.getId(),s.getName()))
                .collect(Collectors.toList())
        );

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

这是测试方法的逻辑。我嘲笑了一个对象,期望结果返回相同的对象

    @Test
    public void getTemplates() {
        classToTest = mock(ClassToTest.class);
        Template template1 = new Template(1,"template1");
        List<Template> templates = new ArrayList<>();
        templates.add(template1);
        template = mock(Template.class);
        when(template.getTemplates()).thenReturn(templates);

        List<TemplateDto> result = classToTest.getTemplates("template1");
        assertEquals(result.get(0).getName(),"template1");
    }
Run Code Online (Sandbox Code Playgroud)

测试应该通过,但是失败,并显示以下错误:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Run Code Online (Sandbox Code Playgroud)

为了获得预期的结果,我还有什么需要嘲笑的吗?

Mac*_*ski 6

1)您永远不会模拟被测类

2)您必须在被测类上设置模拟值

    classToTest = new ClassToTest();
    template = mock(Template.class);
    classToTest.setTemplate(template);
    when(template.getTemplates()).thenReturn(templates);

    List<TemplateDto> result = classToTest.getTemplates("template1");
Run Code Online (Sandbox Code Playgroud)