SpringFramework/JUnit Test 13

MockMvc get post 테스트

MockMvc를 통한 Get, Post 테스트 방법을 소개한다. Get // 리스트, 객체등을 쉽게 전달하기 위해서 MultiValueMap을 사용한다. MultiValueMap multiValueMap = new LinkedMultiValueMap(); multiValueMap.put("articleId", articleIdList); // 리스트 변환 없이 전달가능 MockHttpServletResponse response = mockMvc.perform( get("/data/getManageDebateList") // PathVariable 응답 URL 작성 // get("/news/detail/hotissue/{menuId}/{id}", menuId, id) .params(multiValueMap..

단위테스트시 @value 값 주입 방법

SpringBootTest 어노테이션이 없는 단위 테스트시 @value값이 주입되지 않는 경우가 발생한다. 아래 코드를 추가하면 설정파일을 자동으로 읽어와 @value에 주입한다. @ContextConfiguration( initializers = {ConfigFileApplicationContextInitializer.class} ) 예제 @SpringBootTest 미사용시 @DisplayName("Redis 기본 기능 테스트") @ActiveProfiles(profiles = "local") @ExtendWith(SpringExtension.class) @ContextConfiguration( initializers = {ConfigFileApplicationContextInitializer.cla..

단위 테스트 작성 규칙

단위 테스트 작성시 지켜야할 3가지 규칙 규칙1. 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 규칙2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 규칙3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 세 가지 규칙을 지키면, 개발과 테스트가 대략 30초 주기로 묶인다. 테스트 코드와 실제 코드가 함께 나올뿐더러 테스트 코드가 실제 코드보다 불과 몇 초 전에 나온다. 이렇게 일하면 매일 수십 개, 매달 수백 개, 매년 수천 개에 달하는 테스트 케이스가 나온다. 실제 코드를 사실상 전부 테스트하는 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다. 단위 테스트 코드 품..

JUnit DataJpaTest 단위 테스트 (with vault)

Vault를 적용중인 프로젝트에서 DataJpaTest를 통한 단위 테스트 방법을 제시한다. @ExtendWith(SpringExtension.class) @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 임베디드 DB미사용 (개발 MySql사용) @Import(VaultConfig.class) // DataSource Bean을 주입받음 class PoolContentRepositoryTest { @Autowired PoolContentRepository poolContentRepository; @Test void test(){ // DoSomething } }

Mock Response 객체로 변환

Mock 객체를 이용해 Controller를 호출하고, 그 결과를 객체로 변환하여 테스트한다. @SpringBootTest @AutoConfigureMockMvc class TestControllerTest { final static String head_url = "/test"; @Autowired CleanAPIController cleanAPIController; @Autowired MockMvc mockMvc; @Test void bbsList() throws Exception { // 기본 응답 테스트 mockMvc.perform(get(head_url + "/bbs/list")) .andExpect(status().isOk()) .andDo(print()); // 변환 테스트 MockHttpS..

JUnit5 assertAll 사용법

테스트 결과를 여러개 실행하여 결과를 도출하기 위해 사용 코드 @Test void findBySource(){ Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending()); Page bySource = poolContentRepository.findBySource(ContentSource.news, pageable); bySource.stream().findFirst().ifPresent(poolContent -> { assertAll( "first test", () -> assertEquals(12324, poolContent.getId()), () -> assertEquals(ContentSource.news, poolCon..

SpringBoot JUnit5 의존성 설정

SpringBoot 2.1 이하의 버전의 경우 // junit5 testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude module : 'junit' } testImplementation("org.junit.jupiter:junit-jupiter-api") testCompile("org.junit.jupiter:junit-jupiter-params") testRuntime("org.junit.jupiter:junit-jupiter-engine") test { useJUnitPlatform() } SpringBoot 2.2 이상의 버전의 경우 testImplementation("org.springframework.b..

Spring Seurity 적용시 테스트 방안

SecurityContextHolder를 통해서 인증정보를 설정 테스트 실행 전 인증 정보를 직접 입력하여 테스트 진행 @Before public void setUp() { SecurityContextHolder.getContext() .setAuthentication(new UsernamePasswordAuthenticationToken("test1" , "test1" , Arrays.asList(new SimpleGrantedAuthority("ROLE_USER")) )); } WithMockUser 어노테이션 사용 별도의 UserDetailsService와 같은 스텁을 제공하지 않아도 간단하게 인증정보를 설정하기 위한 어노테이션 @Test @WithMockUser(value="test1",roles..