참고
Spring 단위 테스트
Controller 테스트 - @WebMvcTest
NOTE
@WebMvcText 어노테이션을 사용하면, MockMvc가 자동으로 생성되며, ControllerAdvice나 Filter, Interceptor등 웹 계층에 필요한 요소들을 모두 빈으로 등록해서 환경을 구성한다.
@WebMvcTest(AuthController.class)
class AuthControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext ctx;
@MockBean
private AuthService authService;
@MockBean
private TokenProvider tokenProvider; // 이거 안하니 에러남;
// 한글깨짐을 방지하기 위해 추가코드
@BeforeEach
void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx)
.addFilters(new CharacterEncodingFilter("UTF-8", true))
.alwaysDo(print())
.build();
}
// 테스트 코드
}
Java
복사
@ExtendWith(MockitoExtension.class)를 작성하지 않고 MockMvc를 편리하게 생성시켜줌!
•
@WebMvcTest는 스프링부트가 제공하는 테스트 환경이므로 기존과 다르게 설정된다.
◦
@Mock, @Spy ⇒ @MockBean, @SpyBean
•
@SpringBootTest와 차이점
◦
Web Layer 관련 빈만 로드하기 때문에, 속도가 @SpringBootTest보다 빠르다.
◦
통합테스트에서 테스트가 어려운 작은 단위 테스트들을 @WebMvcTest로 진행할 수 있다.
◦
Mock 객체를 사용하기 때문에 실제 환경에서는 다른 오류가 발생할 수 있다.
Controller 테스트 - @WithUserDetails
NOTE
@WithUserDetails는 테스트에서 특정 사용자의 인증 상태를 시뮬레이션 하기 위해 사용된다!
@BeforeEach
public void setUp() {
userRepository.save(newUser("ssar", "쌀"));
em.clear();
}
@WithUserDetails(value = "ssar", setupBefore = TestExecutionEvent.TEST_EXECUTION)
@Test
public void findUserAccount_test() throws Exception {
// given
// when
ResultActions resultActions = mvc
.perform(get("/api/s/account/login-user"));
String responseBody = resultActions.andReturn().getResponse().getContentAsString();
System.out.println("테스트 : " + responseBody);
// then
resultActions.andExpect(status().isOk());
}
Java
복사
user@example.com 사용자가 인증된 상태에서 테스트가 실행된다.
•
메서드에 사용자 이름을 제공하면, 해당 이름에 해당하는 사용자의 UserDetail을 사용한다.
•
실제로 해당 username을 가진 user가 존재해야 하므로 @BeforeEach를 통해서 user를 저장하자
◦
@Before이전에 @withUserDetails가 동작하는 문제가 발생한다면 setupBefore 설정을 수정해야한다.
@Sql teadown.sql - PK초기화
NOTE
테스트 코드에서 @Transactinal을 사용하면 테스트 수행 후 롤백이 되지만, PK를 auto-increment를 설정한 경우 값이 초기화 되지 않는다!
1번째 테스트
2번쨰 테스트(PK가 1이 아닌 3부터 시작하는걸 볼 수 있다)
•
이를 해결하기 위해서는 테스트코드에 @Transactional이 아닌 쿼리로 테이블 자체를 초기화시킨다.
@Sql("classpath:db/teardown.sql")
@ActiveProfiles("test")
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class AccountControllerTest {..}
SQL
복사
SET REFERENTIAL_INTEGRITY FALSE; -- 모든 제약 조건 비활성화
truncate table transaction_tb;
truncate table account_tb;
truncate table user_tb;
SET REFERENTIAL_INTEGRITY TRUE; -- 모든 제약 조건 활성화
SQL
복사
•
하지만 위의 쿼리는 테이블을 모두 초기화해서 복구하기 어려울 수 있으므로, 테스트나 개발 목적으로 만 진행하는것을 권장한다.
서비스 테스트에 대해 생각해보자
NOTE
•
•
@DataJpaTest
NOTE
•
•
CORS
NOTE
•
•
목차
NOTE
•
•
목차
NOTE
•
•