30장. MockMvc로 긍정·부정 계약을 함께 고정한다
spring-security-test는 MockMvc에 filter chain을 적용하고 사용자, JWT, CSRF를 구성하는 도구를 제공한다. MockMvc 설정 공식 문서를 기준으로 standalone setup에서 springSecurity()를 누락하지 않는다. @SpringBootTest와 @AutoConfigureMockMvc는 실제 chain을 함께 검증한다.
@Test void crossTenantAdminIsDenied() throws Exception {
mvc.perform(get("/api/tenants/ACME/contracts/C-1042")
.with(user("mallory").roles("ADMIN")))
.andExpect(status().isForbidden());
}
긍정 테스트 한 개마다 중요한 부정 변형을 만든다: 익명, 잘못된 role, 다른 tenant, CSRF 누락, 잘못된 상태, 추가 인증 만료, 존재하지 않는 resource. 부정 테스트는 공격 코드를 과장하는 것이 아니라 제품 경계를 문서화한다.
mock user만 쓰면 실제 OIDC/JWT converter 오류를 놓친다. 별도 slice에서 실제 claim 변환과 validator를 시험하고, staging에서는 test issuer로 authorization code와 key rotation을 통합 검증한다. 운영 공급자의 실제 사용자 데이터나 token을 test fixture에 저장하지 않는다.