2022-06-16 @이영훈
Kotlin + Spring Boot에서 테스트할 때 Mockito의 capture와 eq 함수는 에러가 납니다.
해결방법은 다음과 같이 NPE를 막기 위해
1.
kotlin 헬퍼 함수를 작성하거나
/**
* Returns Mockito.eq() as nullable type to avoid java.lang.IllegalStateException when
* null is returned.
*
* Generic T is nullable because implicitly bounded by Any?.
*/
private fun <T> eq(obj: T): T = Mockito.eq(obj)
/**
* Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException
* when null is returned.
*/
private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
Kotlin
복사
2.
mockito-kotlin을 사용하면 됩니다.
헬퍼 함수를 사용해서 작성한 테스트 코드 예시
다음과 같은 MessageBroker class가 있다고 했을 때 message의 값을 capture해서 비교하는 테스트 코드를 작성합니다.
@Component
class MessageBroker() {
fun publish(topic: String, message: MessageDTO) {
// code...
}
}
class MessageDTO(
val id: String,
val content: String,
)
Kotlin
복사
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.verify
import org.mockito.junit.jupiter.MockitoExtension
@ExtendWith(MockitoExtension::class)
internal class MessageBrokerTest {
@Mock
private lateinit var messageBroker: MessageBroker
// helper methods
private fun <T> eq(obj: T): T = Mockito.eq(obj)
private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
@Captor
lateinit var messageCaptor: ArgumentCaptor<MessageDTO>
@Test
fun `test publish`() {
// given
val topic = "some-topic"
val message = MessageDTO(id = "message-id", content = "hello world")
// when
messageBroker.publish(topic, message)
// then
verify(messageBroker).publish(eq("some-topic"), capture(messageCaptor))
assertThat(messageCaptor.value.id).isEqualTo("message-id")
assertThat(messageCaptor.value.content).isEqualTo("hello world")
// 다음과 같이 Recursive 비교를 통해 객체 자체를 비교할 수도 있습니다.
assertThat(messageCaptor.value)
.usingRecursiveComparison()
.isEqualTo(MessageDTO(id = "message-id", content = "hello world"))
}
}
Kotlin
복사
Reference
eq, any, capture 헬퍼 메소드
Recursive 비교