【问题标题】:Why does Mockito expects my verification method to be called with `Nothing`? [duplicate]为什么 Mockito 期望我的验证方法用 `Nothing` 调用? [复制]
【发布时间】:2019-06-05 13:42:26
【问题描述】:

在我的项目中,我尝试设置一个测试,在该测试中应该验证是否使用特定参数调用了一个方法。为此,我使用 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

这不会编译并表示publish 的参数应该属于Nothing! 类。为什么是这样?

【问题讨论】:

标签: java kotlin mocking mockito ros


【解决方案1】:

那是因为您的 Publisher 类是通用的。使用mock(Publisher::class.java) 代码创建模拟会创建Publisher&lt;*&gt; 对象(这意味着类型参数是Nothing)。

要解决这个问题,您不能只在模拟创建代码中放置类型参数 - Publisher&lt;String&gt;::class.java 不是 Java 或 Kotlin 的有效代码。

你所能做的就是不加检查:

val publisherMock = mock(Publisher::class.java) as Publisher<String>

如果您需要禁用来自Android Studio 的警告,只需在此之前放置@Suppress("UNCHECKED_CAST") 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多