模拟测试方法中的类



我对一个必须模拟的类有问题。

测试方法如下:

testedMethod(Date from, Date to, Set set1, Set set2, SomeContext context) { method body };

现在,在方法体内部,使用了一个类。用法如下:

List list = ComponentsFetcher.getComponent(String string1, context, from, to, String string2);

整个测试方法(有点简化)如下:

public static final long testedMethod(Date from, Date to, Set set1, Set set2, SomeContext context) {
    long returnedLong = 0;
    List list1 = ComponentsFetcher.getComponent(String string1, context, from, to, String string2);
    List list2 = ComponentsFetcher.getComponent(String string3, context, from, to, String string4);
    returnedLong = TestedMethodsClass.anotherMethod(from, to, set1, set2, list1, list2
    return returnedLong;
};

这个ComponentsFetcher.getComponent()方法做了很多事情,但我需要的只是得到这个list,我知道这个列表是什么样子的,我可以简单地创建它,然后在测试方法中使用它。

所以我想这样嘲笑ComponentsFetcher.getComponent()

private void mockComponentsFetcher(Date from, Date to, ComponentsContext context, List list1, List list2) throws SomeBusinessException {
    Mockito.mock(ComponentsFetcher.class);
    Mockito.when(ComponentsFetcher.getComponent(string1, context, from, to, string2)).thenReturn(list1);
    Mockito.when(ComponentsFetcher.getComponent(string3, context, from, to, string4)).thenReturn(list2);
    }

最后,@Test方法:

@Test
    public void testTestedMethod() throws ParseException, SomeBusinessException {
        //given
        Date from = DateHelper.getDate(2011, 07, 03);
        Date to = DateHelper.getDate(2012, 07, 03);
        Set set1 = null; // can be null
        Set set2 = DateHelper.getDate(2011, 07, 03);
                Date day = DateHelper.getDate(2011, 07, 03);
        List list1 = getList(new Date[]{
                                // contents of the list
               });
        List list2 = getList(new Date[]{
                                // contents of the list
               });
        //mock
        ComponentsContext context = mockContext(day);

//这个上下文真的很重要,它只是为了让方法运行而被嘲笑的。

//主要问题是,我不知道如何使用这个模拟的ComponentsFetcher,而它是在testedMethod 中使用的

        mockComponentsFetcher(from, to, context, list1, list2);
        //when
        long months = TestedMethodsClass.testedMethod(from, to, set1, set2, context);
        //then
        long awaited = 12;
        assertThat(months).isEqualTo(awaited);
    }

但它根本不起作用。。。

不能使用mockito模拟静态方法。如果你想继续使用mockito,试着重新设计你的类,使方法不是静态的,然后模拟对象的实际实例。

出于单元测试的考虑,总是倾向于避免全局singleton(正是由于您遇到的问题),而依赖于依赖注入。这意味着您将在代码的其他地方创建ComponentsFetcher,并将其传递给正在测试的类,可能是在构建时。这将允许您在准备单元测试时注入模拟的,并在生产时使用真实的。

相关内容

  • 没有找到相关文章