Spring MVC(MocKito 실습)

Rina's·2023년 6월 30일

코드스테이츠

목록 보기
56/96
post-thumbnail

컨트롤러 슬라이딩 테스트

공통 설정

Patch Test

given: Dto -> entity() -> given(willReturn())
when: Dto -> gson() -> perform(patch(URI)).content(gson) 실행
Then: perform() 리턴 값과 Dto 객체 비교

get Test

given: entity.setter(), entity -> given()
when: perform(get(URI)) 실행(requestbody 없음으로 gson 필요 없음)
Then: perform() 리턴 값과 entity 객체 비교

get Test(페이지네이션)

given: entity(List) -> Page
when: perform(get(URI).param())실행, 페이지네이션을 위한 param 추가
Then: 추가한 member 수 만큼 length 확인, name 검증

delete Test

given: when(service).delete() 실행 시, doNothing()
when: perform(delete(URI)) 실행
Then: NoContent 검증

서비스 슬라이딩 테스트

공통 설정

더미 repository를 service가 가지고 있게 함

cancel Test

entity.setter
given(repository.findById()) 재 정의
OrderStatus 불충족으로 exception 발생

Q.

null이 아닌 exception?

Member객체 생성에서 Stamp 객체를 생성하지 않으면 mockMvc.perform() 실행시
포스트맨 응답 값에 stamp : null을 예상했으나

  Body = "data":
              "memberId":0,
              "email":"klm@gmail.com",
              "name":"김로미","phone":"010-1234-5555",
              "memberStatus":"활동중"
  			  "stamp": null 			//예상

              "status": 200,
              "message":"Ok",
              "fieldErrors":null,"violationErrors":null            

실행시 NullPointerException 가 떴다(해당 코드 지우고 실행시)

  Body = "data":
              "memberId":0,
              "email":"klm@gmail.com",
              "name":"김로미","phone":"010-1234-5555",
              "memberStatus":"활동중"		//실제

              "status": 500,
              "message":"Internal Server Error",
              "fieldErrors":null,"violationErrors":null              

이는 mockMvc.perform() 실행 시 마지막 JSON 포멧형태가 GsonJackson냐의 차이었다

Gson은 null 값을 포함한 객체를 JSON의 null 값으로 표현하지만
Jackson은 null 값을 가진 필드를 기본적으로 JSON에서 제외시킨다
즉, 스템프 객체가 없어서 null 값이 저장되면 Jackson은 JSON으로 변환하는 과정에서 해당 필드를 포함하지 않게되고 NullPointerException이 발생한다고 한다

매처의 동일타입 복수설정?

when(mock.get(any())).thenReturn("Any"); //모든 타입의 인자에 반응
when(mock.get(anyInt())).thenReturn("Int"); //모든 int값의 인자에 반응  

위와 같이 복수로 매처가 설정 된 경우
get(10)을 호출했을때 "Any"와 "Int" 둘 다를 리턴할 것 같지만 실제로는 "Int"만 리턴된다
매처들 중에서 가장 마지막으로 설정된 매처부터 시작하여 역순으로 확인하며, 일치할시 그에 해당하는 값을 반환하고 종료된다.
즉, 하나의 호출에 일치하는 값은 하나가 된다

Mockito.any()는 검증이 재대로 안되니 쓰지 말라고?

id값을 찾는 매처타입에 any()를 설정하니 NullPointerException 가 나온다

'무슨 값을 넣더라도 리턴값을 고정했으니 상관없잖아?' 라고 생각했지만
"스텁화 또는 검증이 불가능한 메서드에 대해 매개변수 매처를 사용할 수 없습니다"라며

친절한 예시와 함께 메서드 필요 매개변수 타입이 기본 데이터 타입(primitive argument)일때는 기본 참조타입(primitive alternatives)를 사용하라고 말해준다

profile
갭린이 리나

0개의 댓글