为什么 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") 行。