간단한 단위 테스트를 작성했습니다.
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())
}
}
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 에러가 발생합니다.

any() 안에 클래스를 인자로 넘겨봐도 여전히 동일한 에러가 발생하죠.
//any(...) must not be null
BDDMockito.given(boardRepository.save(any(Board::class.java)))
.willReturn(board)
자바에서 테스트 코드를 작성할 때는 아무런 문제가 없었습니다. 근데 왜 코틀린에서는 문제가 발생하는 걸까요?
any()의 내부에서 defaultValue()를 사용하고 있습니다.
