1. 概述

在这篇简短教程中,我们将重点讲解如何使用Mockito mock final类和方法。

如同其他专注于Mockito框架的文章(如Mockito验证Mockito的When/ThenMockito的Mock方法)一样,我们将在测试用例中使用下面的MyList类作为协作对象。

我们将为本次教程添加一个新的方法:

public class MyList extends AbstractList<String> {
    final public int finalMethod() {
        return 0;
    }
}

并为其扩展一个final类:

public final class FinalList extends MyList {

    @Override
    public int size() {
        return 1;
    }
}

2. mock final方法

一旦Mockito配置完毕,我们可以像模拟其他方法一样轻松地模拟final方法:

@Test
public void whenMockFinalMethod_thenMockWorks() {

    MyList myList = new MyList();

    MyList mock = mock(MyList.class);
    when(mock.finalMethod()).thenReturn(1);

    assertThat(mock.finalMethod()).isNotZero();
}

通过创建MyList的实例和模拟实例,我们可以比较两个版本的finalMethod()返回的值,并验证模拟对象被正确调用了。

3. mock final类

mock final类与mock任何其他类同样简单:

@Test
public void whenMockFinalClass_thenMockWorks() {

    FinalList mock = mock(FinalList.class);
    when(mock.size()).thenReturn(2);

    assertThat(mock.size()).isNotEqualTo(1);
}

类似上述测试,我们创建了最终类的实例和模拟实例,模拟了一个方法,并验证了模拟实例的行为有所不同。

4. 总结

在这篇快速的文章中,我们介绍了如何使用Mockito扩展来模拟最终类和方法。完整的示例,如往常一样,可以在GitHub上找到。