首页 > 解决方案 > 为什么 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!。为什么是这样?

标签: javakotlinmockingmockitoros

解决方案


那是因为您的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")行的警告。


推荐阅读