1

In my project I tried to setup a test in which should be verified that a method is called with a specific parameter. For this I am using Mockito and Kotlin.

In the test I am using a mock class. (publisher) This class is part of rosjava and contains a method 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);
}

When I try to set my expectation like:

val publisherMock = mock(Publisher::class.java)

verify(publisherMock, atLeastOnce()).publish(message) // message is underlined with a red color

This does not compile and says that the parameter for publish should be of class Nothing!. Why is this?

Klyner
  • 3,983
  • 4
  • 26
  • 50

1 Answers1

2

That's because your Publisher class is generic. Creating mock with mock(Publisher::class.java) code creates Publisher<*> object (it means that type parameter is Nothing).

To solve it you can't just place type parameter in mock creating code - Publisher<String>::class.java is not a valid code for Java or Kotlin.

All you can do is unchecked cast:

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

If you need to disable warning from Android Studio just place @Suppress("UNCHECKED_CAST") line before that.

Ircover
  • 2,406
  • 2
  • 22
  • 42