繁体   English   中英

最终 class 和最终方法 - Mocking 和 Mockito 2

[英]Final class and Final method - Mocking with Mockito 2

Mockito 2 提供的功能是使用 org.mockito.plugins.MockMaker(mock-maker-inline) 来模拟最终方法和最终类,通常可用(已发布)或仍处于孵化阶段。 我在我的应用程序中使用了 mockito-core-2.23.4 工件。 mocking 最终类和方法中需要建议。 是否建议使用这种方法或寻找替代选项?

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

例子:

假设我们有一个如下所示的MyList class 作为测试用例中的协作者。

我们将为这个 class 添加一个新的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 可以用于 mocking 最终类和方法之前,需要对其进行配置。

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

模拟机内联

Mockito 在加载时检查配置文件的扩展目录。 此文件启用最终方法和类的 mocking。

模拟最终方法:

正确配置 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()返回的值并验证是否调用了模拟。

模拟最终 Class:

Mocking 最终 class 与 mocking 任何其他 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 一样简单

@Test
public void whenMockFinalClassMockWorks() {

    FinalList finalList = new FinalList();

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM