mockito-kotlin
mockito-kotlin copied to clipboard
Any() throws method must not be null
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 This is a java-kotlin interop issue I believe and is caused by javas missing null-safety.
Try doThrow(IllegalStateException::class).whenever(mock).go().
@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.