코드 4-2의 테스트는 더 복잡하다. 사실 테스트 두 개를 메서드 하나로 작성했다. 첫 번째 부분은 책을 등록하고 요청 결과를 검증한다. 두 번째 부분은 메인 페이지에 새로운 GET 요청을 실행하여 새로 생성된 책이 모델에 있는지 검증한다.
책 정보를 등록할 때는 웹 브라우저가 애플리케이션에 전송할 때 사용하는 application/x-www-form-urlencoded(MediaType.APPLICATION_FORM_URLENCODED)로 콘텐트 타입을 설정해야 한다. 다음으로 MockMvcRequestBuilders의 param() 메서드로 전송할 폼을 시뮬레이션하는 필드들을 설정한다. 요청을 실행하면 응답이 /로 리다이렉트되는지 검증한다.
첫 번째 테스트 메서드가 성공했다면 두 번째 부분으로 넘어간다. 먼저 응답으로 기대하는 값을 담은 Book 객체를 생성한다. 이 객체는 메인 페이지를 요청한 후 반환되는 모델 값과 비교하는 데 사용한다.
이제 /에 GET 요청을 수행한다. 모델에는 빈 컬렉션 대신 객체 하나를 담은 컬렉션이 있고, 그 객체가 방금 생성한 Book 객체와 동일한지 확인하는 과정을 제외하면 대부분은 앞에서 메인 페이지를 테스트한 방식과 다르지 않다. 두 객체가 같으면 컨트롤러는 POST 요청으로 책을 저장하는 작업을 수행한다고 볼 수 있다.
지금까지는 2장에서 작성한 버전처럼 보안이 없는 애플리케이션을 테스트한다고 가정하고 진행했다. 그런데 3장에서 작성한 버전처럼 보안을 적용한 애플리케이션을 테스트하고 싶다면 어떻게 해야 할까?