Mockito 2提供的功能是使用org.mockito.plugins.MockMaker(mock-maker-inline)来模拟最终方法和最终类,该工具通常可用(已发布)或仍处于孵化阶段。我在应用程序中使用了嘲笑核心2.23.4工件。在模拟最终的类和方法时需要建议。建议使用这种方法还是寻找其他选择?
答案 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());
}
类似于上面的测试,我们为最终类创建一个具体实例和一个模拟实例,模拟一个方法并验证模拟实例的行为是否不同。