코틀린에서 ArgumentMatchers.any()을 사용하면?

간단한 단위 테스트를 작성했습니다.

BoardService에서 BoardRepository가 1번 호출이 됐는지 확인하는 단위 테스트죠.

@ExtendWith(MockitoExtension::class)
class BoardServiceTest {

    @Mock
    private lateinit var boardRepository: BoardRepository

    @InjectMocks
    private lateinit var boardService: BoardService

    @DisplayName("게시판을 생성한다.")
    @Test
    fun create() {
        //given
        val user = User(1L, "테스트")
        val board = Board(1L, "테스트 게시판")

        //any(...) must not be null
        BDDMockito.given(boardRepository.save(ArgumentMatchers.any())) //...1
            .willReturn(board)

        //when
        boardService.create(user) //...1

        //then
        Mockito.verify(boardRepository, times(1))
            .save(ArgumentMatchers.any())
    }

}
  1. boardRepository.create()의 구현은 아래와 같습니다.

    @Service
    class BoardService(
        private val boardRepository: BoardRepository
    ) {
        fun create(user: User): Board {
            val board = Board(1L, "게시판")
            val savedBoard = boardRepository.save(board)
            return savedBoard
        }
    
    }
    

    boardRepository.save()는 인자로 Board 객체를 인자로 받습니다.

    @Repository
    interface BoardRepository {
        fun save(board: Board): Board
    }
    

이 코드를 실행하면 문제가 없을 것 같지만 any(...) must not be null 에러가 발생합니다.

image.png

any() 안에 클래스를 인자로 넘겨봐도 여전히 동일한 에러가 발생하죠.

//any(...) must not be null
BDDMockito.given(boardRepository.save(any(Board::class.java)))
    .willReturn(board)

자바에서 테스트 코드를 작성할 때는 아무런 문제가 없었습니다. 근데 왜 코틀린에서는 문제가 발생하는 걸까요?

ArgumentMatchers.any() 내부 살펴보기

any()의 내부에서 defaultValue()를 사용하고 있습니다.

image.png