为什么 Mockito 期望我的验证方法用 `Nothing` 调用?
Why does Mockito expects my verification method to be called with `Nothing`?
在我的项目中,我尝试设置一个测试,在该测试中应验证是否使用特定参数调用了方法。为此,我使用 Mockito 和 Kotlin。
在测试中我使用的是模拟 class。 (publisher
)这个class是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
这不会编译并表示 publish
的参数应该是 class Nothing!
。为什么是这样?
那是因为您的 Publisher
class 是通用的。使用 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")
行。
在我的项目中,我尝试设置一个测试,在该测试中应验证是否使用特定参数调用了方法。为此,我使用 Mockito 和 Kotlin。
在测试中我使用的是模拟 class。 (publisher
)这个class是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
这不会编译并表示 publish
的参数应该是 class Nothing!
。为什么是这样?
那是因为您的 Publisher
class 是通用的。使用 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")
行。