最终课程和最终方法-使用Mockito 2模拟

时间:2020-04-07 22:30:46

标签: java unit-testing mockito junit4

Mockito 2提供的功能是使用org.mockito.plugins.MockMaker(mock-maker-inline)来模拟最终方法和最终类,该工具通常可用(已发布)或仍处于孵化阶段。我在应用程序中使用了嘲笑核心2.23.4工件。在模拟最终的类和方法时需要建议。建议使用这种方法还是寻找其他选择?

1 个答案:

答案 0 :(得分:0)

从Mockito 2.x开始,Mockito现在支持模拟最终类和方法。

示例:

假设我们有一个MyList类,下面是测试用例中的协作者。

我们将为此类添加新的finalMethod

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

我们还将使用最终的子类对其进行扩展:

public final class FinalList extends MyList {     
    @Override
    public int size() {
        return 1;
    }
}

在将Mockito用于模拟最终类和方法之前,需要对其进行配置。

我们需要向项目的src / test / resources / mockito-extensions目录中添加一个名为org.mockito.plugins.MockMaker的文本文件,并添加一行文本:

mock-maker-inline

在加载扩展名时,Mockito会检查扩展目录中的配置文件。该文件可模拟最终方法和类。

模拟最终方法:

正确配置Mockito后,可以像其他方法一样模仿最终方法:

@Test
public void whenMockFinalMethodMockWorks() {

    MyList myList = new MyList();

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

    assertNotEquals(mock.finalMethod(), myList.finalMethod());
}

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

模拟期末课程:

模拟最终课程与模拟其他任何课程一样容易:

@Test
public void whenMockFinalClassMockWorks() {

    FinalList finalList = new FinalList();

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

    assertNotEquals(mock.size(), finalList.size());
}

类似于上面的测试,我们为最终类创建一个具体实例和一个模拟实例,模拟一个方法并验证模拟实例的行为是否不同。

参考:https://www.baeldung.com/mockito-final