- Created by Sansae, last modified on Jun 10, 2020
WebUI개발을 위한 의존성 라이브러리 추가
pom.xml
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
/home 에서 WebUI를 보여주도록 WebController를 추가합니다.
src/main/java/com/example/demo/WebController.java Expand source
package com.example.demo; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @Controller @RequiredArgsConstructor public class WebController { @GetMapping("/home") public String home(Model model) { return "home"; } }
하드코딩된 BaseURL을 삭제 합니다.
- LinkController 와 LinkService를 같이 수정해야 합니다.
src/main/resources/application.properties
- app.baseUrl=http://localhost:8080/
LinkController를 리펙토링 합니다.
src/main/java/com/example/demo/LinkController.java Expand source
package com.example.demo; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; import lombok.Value; import reactor.core.publisher.Mono; @RestController @RequiredArgsConstructor public class LinkController { private final LinkService linkService; @PostMapping("/link") Mono<CreateLinkResponse> create(@RequestBody CreateLinkRequest requestLink) { return linkService.shortenLink(requestLink.getLink()) .map(CreateLinkResponse::new); } @GetMapping("/link/{key}") Mono<ResponseEntity<Object>> getLink(@PathVariable String key) { return linkService.getOriginalLink(key) .map(link -> ResponseEntity.status(HttpStatus.PERMANENT_REDIRECT) .header("Location", link.getOriginalLink()) .build()) .defaultIfEmpty(ResponseEntity.notFound().build()); } @Value public static class CreateLinkRequest { private String link; } @Value public static class CreateLinkResponse { private String shortenedLink; } }
LinkService를 리펙토링 합니다.
src/main/java/com/example/demo/LinkService.java Expand source
package com.example.demo; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @Service public class LinkService { private final LinkRepository linkRepository; public LinkService(LinkRepository linkRepository) { this.linkRepository = linkRepository; } Mono<String> shortenLink(String link) { String randomKey = RandomStringUtils.randomAlphabetic(6); return linkRepository.save(new Link(link, randomKey)) .map(result -> result.getKey()); } Mono<Link> getOriginalLink(String key) { return linkRepository.findByKey(key); } }
LinkControllerTest Expand source
package com.example.demo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Mono; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @RunWith(SpringRunner.class) @WebFluxTest(controllers = LinkController.class) public class LinkControllerTest { @Autowired private WebTestClient webTestClient; @MockBean private LinkService linkService; @Test public void shortensLink() { when(linkService.shortenLink("https://spring.io")).thenReturn(Mono.just("aass2211")); webTestClient.post() .uri("/link") .contentType(MediaType.APPLICATION_JSON) .syncBody("{\"link\":\"https://spring.io\"}") .exchange() .expectStatus() .is2xxSuccessful() .expectBody() .jsonPath("$.shortenedLink") .value(val -> assertThat(val).isEqualTo("aass2211")); } @Test public void redirectsToOriginalLink() { when(linkService.getOriginalLink("aaa21123")) .thenReturn(Mono.just(new Link("http://sprint.io", "aaa21123"))); webTestClient.get() .uri("/link/aaa21123") .exchange() .expectStatus() .isPermanentRedirect() .expectHeader() .value("Location", location -> assertThat(location).isEqualTo("http://sprint.io")); } }
LinkServiceTest Expand source
package com.example.demo; import org.junit.Before; import org.junit.Test; import org.mockito.stubbing.Answer; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class LinkServiceTest { private LinkRepository linkRepository = mock(LinkRepository.class); private LinkService linkService = new LinkService(linkRepository); @Before public void setup() { when(linkRepository.save(any())) .thenAnswer((Answer<Mono<Link>>) invocationOnMock -> Mono.just((Link) invocationOnMock.getArguments()[0])); } @Test public void shortensLink() { StepVerifier.create(linkService.shortenLink("http://spring.io")) .expectNextMatches(result -> result != null && result.length() > 0) .expectComplete() .verify(); } }
- No labels
Add Comment