java - Mockito - 如何在类的抽象方法(即回调)上模拟和表达期望
问题描述
我正在尝试对抽象类进行单元测试,因此需要为类的抽象方法提供模拟实现。
我认为我处于利基境地(!),因为两者都没有@Mock
或@Spy
似乎没有帮助。
- 尝试过
Mockito.mock(SimpleClient.class, Mockito.CALLS_REAL_METHODS)
,但这完全破坏了我的抽象类(在不调用构造函数的情况下创建它,运行到 NPE) - 尝试过
@Spy
,但这要么需要一个真实类的实例(我无法提供,因为它是抽象的duh),或者它会尝试调用一个不存在的无参数构造函数。
(上下文,虽然你不应该需要它:该类是一个消息传递客户端,例如 hassendMessage()
和abstract onMessage()
方法,显然我需要使用真正的实现sendMessage()
并模拟回调abstract onMessage()
)
解决方案
我发现了以下
为了采用第一种方法
Mockito.mock
(:MyClass mock = Mockito.mock(MyClass.class, Mockito.withSettings() .useConstructor("stringArg", 17) .defaultAnswer(Mockito.CALLS_REAL_METHODS)); // ... Mockito.when(mock.onMyAbstractMethod(Mockito.anyInt())).then( invocation -> mock.callAnotherRealMethodOnTheMock(invocation.getArgument(0)));
要采用第二种方法,确实
@Spy
需要创建一个类的实例,所以在这种情况下,你真的需要先对它进行子类化。
额外说明onMyAbstractMethod
:如果 say返回 void,则会发生一个单独的问题,也很丑陋,在这种情况下,Mockito.when...
由于语言限制,语法不起作用,这是一个记录不充分的事实。一个人需要反过来说:
Mockito.doAnswer(invocation -> mock.callAnotherRealMethodOnTheMock(invocation.getArgument(0)))
.when(mock).onMyAbstractMethod(1);
推荐阅读
- mysql - 使用 Laravel 编写复杂的查询
- wso2 - 启动开发人员工作室 WSO2 Api 管理器时出错 (eclipse)
- livecode - LiveCode 圆角堆栈角
- npm - 为节点项目设置 npm 模块的自定义路径
- python-3.7 - Python我如何知道我的鼠标光标何时选择链接
- azure - Kubernetes部署azure函数时如何检索函数键
- python - 我应该怎么做才能排除我的程序读取文本文件中的空行但仍然包含空格
- angular - 当使用 observable 和 in memory 服务时,Stagger 和 Animation 不适用
- javascript - 从组件角度添加类
- javascript - Vue - 为什么使用延迟加载添加组件需要 2 个刻度