Mocking

mocking이라는 단어를 처음 들어봐서 구글링해봤다.

Mock

즉 테스트하고자 하는 코드가 의존하는 function이나 class에 대해 모조품을 만들어 ‘일단’ 돌아가게 하는 것이다. 한마디로, 단위 테스트를 작성할 때, 해당 코드가 의존하는 부분을 가짜(mock)로 대체하는 기법을 말한다.

왜 가짜로 대체하는가?

테스트 하고싶은 기능이 다른 기능들과 엮여있을 경우(의존) 정확한 테스트를 하기 힘들기 때문이다.

예를들어 request body에 사용자의 id와 password를 넣어서 post요청을 보내면 컨트롤러에서 정보를 추출한 후 데이터베이스에 넣어주는 단위테스트를 하고 싶다고 하자

작은 단위의 함수나 모듈이 의도된 대로 정확히 작동하는지 테스트하는 것을 유닛 테스트 (unit test) 또는 단위 테스트라고 부른다.

데이터베이스에 저장 요청을 보내면 성공이든 실패든 응답이 반환될 것이고, 반환된 응답을 기준으로 테스트의 성공과 실패를 구분한다.

이때 실제 데이터베이스에 사용자의 id, password를 넣는 방식으로 테스트를 하는 것은 좋은 방법이 아니다. 실제 트랜잭션이 일어나기에 IO 시간도 테스트에 포함되고, 데이터베이스 연결 상태에 따라 테스트가 실패할 수도 있기 때문이다. 테스트가 실패했을 경우 내가 작성한 컨트롤러 코드의 문제인지, 데이터베이스의 문제인지 알아차리기도 힘들기 때문에 올바른 단위테스트라고 할 수 없다.

따라서 실제 데이터베이스에 데이터를 넣는 것이 아니라 넣은 셈 치자는 개념이다. 데이터베이스가 잘 작동하는지는 데이터베이스 관련 테스트에서 확인하면 되고, 우리는 지금 컨트롤러에 대한 테스트를 진행하고 있으니 데이터베이스가 잘 작동한다는 전제를 깔고 가자는 뜻이다.

기존의 데이터베이스 저장 메소드를 mock 함수로 만든다. 이제 이 아무 의미 없는 mock함수를 호출했을때 반환 받기 원하는 값을 우리가 직접 지정해 준다. 우리는 controller의 로직에 집중해야하니 데이터베이스는 대충 이런이런 값을 반환한다고 치자라고 하고 넘어가는 개념이다.

private MockMvc mvc

웹 API를 테스트할 떄 사용한다.
스프링 MVC 테스트의 시작점이다.
이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.