개발
home
🩺

Kotlin + Spring Boot에서 Captor, capture 사용 예시

Created
2022/06/16
Tags
trouble shooting
TestCode
Kotlin
SpringBoot
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을 사용하면 됩니다.
mockito-kotlin
mockito

헬퍼 함수를 사용해서 작성한 테스트 코드 예시

다음과 같은 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 비교