외부에서 테스트
- 목 MVC는 동일 프로세스에서 실행되므로 @WithMockUser와 with(csrf())가 여전히 작동한다. 외부 포트에서 테스트를 실행하면 더 동작하지 않는다.
- 외부 포트에서 애플리케이션을 테스트하려면 테스트 클라이언트 TestRestTemplate나 WebTestClient를 통해 테스트를 실행하고 통합 테스트에서 먼저 폼 기반 로그인을 수행해 인증 헤더를 전달하거나 플로우를 구현해야 한다.
TestRestTemplate 예제)
https://www.baeldung.com/spring-boot-testresttemplate
https://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/html/boot-features-testing.html
https://blog.csdn.net/neweastsun/article/details/100750909
환경)
JAVA 11.0.6
스프링 부트 스타터 2.2.4
httpclient 4.5.
스프링 부트 스타터 시큐리티 2.2.4
스프링 시큐리티 테스트 5.2.1
코딩)
1) 자체 인증서 생성후 자바 jdk11 폴더안 인증서에 localhost 이름으로 등록
2) http://localhost:8080 입력시 https://localhost:8443으로 리다이렉트
에러내용 : org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://localhost:8443/": Connect to localhost:8443 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect; nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:8443 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
에러 대응 불가능
아직 공부단계라서 이해도가 높으면 다시 시도할 예정
WebTestClient 예제)
참고사이트)
결정적 힌트 - https://box0830.tistory.com/194
★★★★ - https://m.blog.naver.com/wndrlf2003/220650780438
https://cheolhojung.github.io/posts/java/springboot-test.html
https://www.viralpatel.net/basic-authentication-spring-webclient/
https://www.lesstif.com/pages/viewpage.action?pageId=12451848
https://www.lesstif.com/pages/viewpage.action?pageId=20775436
https://www.lesstif.com/pages/viewpage.action?pageId=12451848
https://www.baeldung.com/httpclient-ssl
https://www.baeldung.com/csrf-thymeleaf-with-spring-security
https://www.baeldung.com/x-509-authentication-in-spring-security
https://laptrinhx.com/spring-rest-spring-security-example-1535996983/
https://junemoon.tistory.com/177
개인 인증서가 있는데 이것을 신뢰할수있게 설치해야된다.
keyStore Explorer 다운로드 : http://keystore-explorer.org/downloads.html
1) 먼저 새로운 개인키를 생성
2. JSK
3. 개인키생성
4. RSA 설정 기본 2048 추천
5. 유효기간 설정할수있지만 추가적으로 설정하기위해 책 클릭
6. CN을 localhost 하고 나머지는 알아서 입력
마지막은 국가코드 2자리
7. 입력된거 확인
8. OK누르면 별칭입력나오는데 여기또한 그냥 localhost입력
9. 입력한거 확인후 저장
저장시 server.jks 비번설정
10. 공개키 만들기
마우스 오른쪽 클릭후 Export Certificate Chain 누르기
11. X.509 확인후 Export
12. Open CA Certificate 클릭
13. 목록 여러개뜨지만 비공개로 처리했습니다. 빨간색 모양 클릭
14. 아까 공개키 만든것을 입력
별칭물어보는데 이또한 localhost 입력
15. 입력된것을 확인가능
Last Modified 순으로 보면 편함
리소스 폴더아래 아까만든 keystore.jks 붙여놓고 테스트 자바클래스를 만듭니다.
POM.XML 추가
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
<scope>test</scope>
</dependency>
<!-- hot swapping, disable cache for template, enable live reload -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
application.properties
server.port=8443
server.ssl.key-store=classpath:ssl/server.jks
server.ssl.key-store-password=password
server.ssl.key-store-type=jks
server.ssl.key-alias=localhost
server.ssl.key-password=password
spring.security.user.name=user
spring.security.user.password=123456
server.ssl.trust-store=C:\\Program Files\\Java\\jdk-11.0.6\\lib\\security\\cacerts
server.ssl.trust-store-password=changeit
package com.example.demo;
import com.example.demo.library.Book;
import com.example.demo.library.BookService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.reactive.server.WebTestClient;
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class BookControllerIntegrationTest {
WebTestClient webTestClient;
@MockBean
private BookService bookService;
@BeforeEach
public void setup() {
this.webTestClient = WebTestClient
.bindToServer()
.baseUrl("https://localhost:8443")
.build();
}
@Test
public void shouldReturnListOfBooks() throws Exception{
webTestClient.get().uri("/books")
.exchange()
.expectStatus().isOk()
.expectBodyList(Book.class).hasSize(3);
}
}
Hamcrest : https://www.vogella.com/tutorials/Hamcrest/article.htmlhttps://www.vogella.com/tutorials/Hamcrest/article.html
webtestclient : https://www.callicoder.com/spring-5-reactive-webclient-webtestclient-examples/
'WEB > 스프링 부트 2' 카테고리의 다른 글
Spring Security Method SpEL (0) | 2020.02.13 |
---|---|
Spring Security + H2 (0) | 2020.02.12 |
Spring Security (0) | 2020.02.10 |
WebFlux + Thymeleaf (0) | 2020.02.07 |
WebFlux (0) | 2020.02.07 |