mockito-kotlin icon indicating copy to clipboard operation
mockito-kotlin copied to clipboard

Any() throws method must not be null

Open mtwolak opened this issue 4 years ago • 3 comments
trafficstars

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?

mtwolak avatar Nov 26 '20 20:11 mtwolak

@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().

bohsen avatar Nov 26 '20 21:11 bohsen

@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.

usr42 avatar Apr 16 '21 04:04 usr42