티스토리 뷰

반응형

위의 이미지처럼 Gradle -> Tasks -> verification -> test를 클릭하면 전체 테스트를 수행할 수 있다.

 

시큐리티 적용으로 인하여 인증된 사용자만이 API를 호출할 수 있게 변경되었기 때문에, 모든 테스트가 통과하지 못하고 있다.

 

No qualifying bean of type~ 메시지를 발견할 수 있는데, 소셜 로그인 관련 설정값이 없기 때문에 발생한다.

 

src/main 환경과 src/test 환경은 각자의 환경 구성을 가진다.

 

test에 application.properties가 없으면 main의 설정을 그래도 가져오지만, application-oauth.properties는 가져오지 않는다.

 

이를 해결하기 위해서 test를 위해서 가짜 설정값으로 application.properties를 만들어야 한다.

 

spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.h2.console.enabled=true
spring.session.store-type=jdbc

# Test OAuth

spring.security.oauth2.client.registration.google.client-id=test
spring.security.oauth2.client.registration.google.client-secret=test
spring.security.oauth2.client.registration.google.scope=profile,email

위와 같은 방식으로 가짜 설정값을 넣은 application.properties를 생성하였다.

 

이렇게 하면 실패한 테스트 케이스가 줄어든 것을 확인할 수 있다.

 

다른 테스트는 200(정상 응답)대신 302(리다이렉션 응답)이 와서 실패했다.

 

스프링 시큐리티 설정으로 인증되지 않은 사용자의 요청은 이동시켰기 때문이다.

 

이는 임의의 인증된 사용자를 추가하면 된다.

 

 

build.gradle

testCompile('org.springframework.security:spring-security-test')

위의 testCompile~을 build.gradle의 dependencies에 추가한다. 

 

그리고 gradle을 새로고침 해줘야 한다!

 

spring-security-test는 스프링 시큐리티 테스트를 위한 여러 도구들을 지원한다.

 

@WithMockUser 어노테이션을 사용하여 테스트를 위한 사용자를 만들어서 사용하면 된다.

 

@WithMockUser 어노테이션은 MockMvc에서만 작동하기 때문에, @SpringBootTest에서 MockMvc를 사용할 수 있게 변경해야 한다.

 

@Before 어노테이션을 사용해서 테스트가 시작되기 전에 MockMvc 인스턴스를 생성할 수 있게 변경한다.

 

mvc.perform을 사용해서 MockMvc를 통해 테스트를 하면 된다.

 

얘는 @WebMvcTest가 CustomOAuth2UserService를 스캔하지 않아서 발생하였다.

 

@WebMvcTest가 스캔하는 대상

  • WebSecurityConfigurerAdapter
  • WebMvcConfigurer
  • @ContorollerAdvice
  • @Controller

따라서 스캔할 수 없는 대상을 제거한다.

 

@WebMvcTest(controllers = HelloController.class,
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)
    }
)

 

@EnableJpaAuditing으로 인하여 발생하였다. @EnableJpaAuditing을 사용하기 위해서는 최소 하나의 @Entity 클래스가 필요하다.

 

@SpringBootApplication과 @EnableJpaAuditing을 다른 클래스로 분리한다.

 

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

위의 코드와 같이 다른 클래스를 생성해주면 된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함