mockito / mockito-kotlin

Using Mockito with Kotlin
MIT License
3.1k stars 200 forks source link

Any() throws method must not be null #395

Open mtwolak opened 3 years ago

mtwolak commented 3 years ago

Hi,

I'm mocking spring repository with signature:

JpaRepository<Entity, Id> {
   <S extends Entity> S save(S entity);
}

Here is my try:

val mockRepository = mock<JpaRepository> {
            on { save(any()) } doThrow RuntimeException("Some exception")
        }

But then I got Caused by: java.lang.NullPointerException: save(any()) must not be null In order to fix this, I must do ugly thing, specyfing generic type like:

val mockRepository = mock<JpaRepository> {
            on { save(any<Entity>()) } doThrow RuntimeException("Some exception")
        }

And it works, but IDE (Intellij) is suggesting generic removal: Remove explicit type arguments So I tried something else:

val mockRepository = mock<JpaRepository> {
            on { save(Mockito.any(Entity::class.java)) } doThrow RuntimeException("Some exception")
        }

and IDE is not complaining at all, but it looks ugly. Any better solution?

bohsen commented 3 years ago

@mtwolak This is a java-kotlin interop issue I believe and is caused by javas missing null-safety.

Try doThrow(IllegalStateException::class).whenever(mock).go().

usr42 commented 3 years ago

@mtwolak I your scenario you can also use onGeneric instead of on. Then it should work without explicit type.

But I have a similar issue but I don't want/can specify the mock behavior when the mock is created, but only inside the test. So I usually use something like:

whenever(repository.save(any())).doReturn(entity)

But this also fails without specifying the type exlicitly in the any (any<Entity>()). Is there something similar to onGeneric but for the whenever workflow.

Any help or hint is appreciated.