java - 为什么 Mockito 期望我的验证方法被“Nothing”调用?
问题描述
在我的项目中,我尝试设置一个测试,在该测试中应该验证是否使用特定参数调用了一个方法。为此,我使用 Mockito 和 Kotlin。
在测试中,我使用了一个模拟类。( publisher
) 这个类是 rosjava 的一部分并且包含一个方法publish
;
public interface Publisher<T> extends TopicParticipant { //(java)
void setLatchMode(boolean var1);
boolean getLatchMode();
T newMessage();
void publish(T var1);
boolean hasSubscribers();
int getNumberOfSubscribers();
void shutdown(long var1, TimeUnit var3);
void shutdown();
void addListener(PublisherListener<T> var1);
}
当我尝试设定我的期望时:
val publisherMock = mock(Publisher::class.java)
verify(publisherMock, atLeastOnce()).publish(message) // message is underlined with a red color
这不会编译并说参数 forpublish
应该是 class Nothing!
。为什么是这样?
解决方案
那是因为您的Publisher
课程是通用的。mock(Publisher::class.java)
使用代码创建模拟会创建Publisher<*>
对象(这意味着类型参数是Nothing
)。
要解决它,您不能只在模拟创建代码中放置类型参数 -Publisher<String>::class.java
这不是 Java 或 Kotlin 的有效代码。
您所能做的就是未经检查的演员表:
val publisherMock = mock(Publisher::class.java) as Publisher<String>
如果您需要在此之前禁用Android Studio
仅放置@Suppress("UNCHECKED_CAST")
行的警告。
推荐阅读
- javascript - 为什么 Axios 响应没有控制台日志结果?
- python - 如何让我的深度学习模型在多类分类中将特征作为隐藏层的二进制向量输出
- python - 来自 Pandas 聚合数据的样本
- mysql - 如何在 MYSQL 版本(6.0.11-alpha-community)中创建生成列
- c# - 在 C# 运行时将注入的 DLL 中的函数挂钩到现有方法中
- excel - 从 Col B 不为空的同一行下复制第三个单元格
- python - 是否可以在 imshow 中使用 Y 轴绘制数组数据,该 Y 轴从线性开始,但最终变为非线性步骤
- java - 动态文件名文件追加器 log4j2
- node.js - 如何解决 Electron 中的“CommandNotFoundException”错误?
- r - 根据闪亮应用程序中的 pickerInput() 选择添加或删除数据框中的行