[スプリングガイドとAWS単独で実施されるWebサービス]CHAPTER 2 HelloControllerとテストコードの学習

5283 ワード

1.主クレーム

package com.hadoyaji.book.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;


@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

  • @SpringBootApplication
    :スプリングガイドの自動設定の処理、スプリングbeanの読み取り、自動設定の作成
    :@宣言位置から設定の読み込みを開始するので、プロジェクトの上部に宣言します.

  • SpringApplication.run(Application.class,args);
    :埋め込みwasの実行
  • 2.Hello Controlとテストコード


    1) HelloController
    package com.hadoyaji.book.springboot.web;
    
    import com.hadoyaji.book.springboot.web.dto.HelloResponseDto;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @GetMapping("/hello")
        public String hello(){
            return "hello";
        }
    
        @GetMapping("/hello/dto")
        public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){
            return new HelloResponseDto(name,amount);
    
        }
    }
    

  • @RestController
    :コントローラをJSON復帰コントローラとして作成する
    :ASISメソッドごとに@ResponseBodyと宣言

  • @GetMapping
    :HTTPメソッドgetリクエストを受信できるapiの作成
    :ASIS@requestMapping(method=requestMethod.GET)と同じ
  • 2) HelloControllerTest
    import com.hadoyaji.book.springboot.config.auth.SecurityConfig;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.security.test.context.support.WithMockUser;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    import static org.hamcrest.Matchers.is;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(controllers = HelloController.class,
                excludeFilters = {
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)
                })
    public class HelloControllerTest {
    
        @Autowired
        private MockMvc mvc;
    
        @WithMockUser(roles="USER")
        @Test
        public void hello_가_리턴된다() throws Exception{
                String hello = "hello";
    
                mvc.perform(get("/hello"))
                        .andExpect(status().isOk())
                        .andExpect(content().string(hello));
        }
    
        @WithMockUser(roles = "USER")
        @Test
        public void helloDto가_리턴된다() throws Exception{
            String name = "hello";
            int amount = 1000;
    
            (mvc.perform(get("/hello/dto").param("name", name).param("amount",String.valueOf(amount))))
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.name",is(name)))
                    .andExpect(jsonPath("$.amount",is(amount)));
        }
    
    }

  • @RunWith(SpringRunner.class)
    :JUNIT内蔵エフェクタ以外のエフェクタ(SpringRunner)をテスト中に実行します.

  • @WebMvcTest
    :WEB(Spring MVC)に集中
    :宣言時に@Controller、@Controller Addiceなどを使用可能
    :@Service、@Component、@Repositoryは使用できません

  • @Autowired
    :スプリングによって管理されるギャップを受け入れる

  • private MockMvc mvc;
    :Web APIテスト時に使用する、スプリングMVCテストの起点

  • mvc.perform(get("/hello"))
    :HTTP GET要求

  • .andExpect(status().isOk())
    :検証結果
  • 3.lombokのHelloResponseDtoとテストコードを適用する


    1) HelloResponseDto
    import lombok.Getter;
    import lombok.RequiredArgsConstructor;
    
    @Getter
    @RequiredArgsConstructor
    public class HelloResponseDto {
    
        private final String name;
        private final int amount;
    }
    
  • *lombok
  • を使用
  • @Getter:宣言されたフィルタにgetメソッドを作成する
  • @RequiredArgsConstructor
    :すべての宣言を含むfinalフィールドを含むジェネレータ(finalを除く)
  • を作成します.
    2)HelloResponseDtoTest
    :RequiredArgsConstructorのジェネレータとして作成するかどうかをテストします.
    import org.junit.Test;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    public class HelloResponseDtoTest {
    
        @Test
        public void 롬복_기능_테스트(){
            //given
            String name = "test";
            int amount = 1000;
    
            //when
            HelloResponseDto dto = new HelloResponseDto(name,amount);
    
            //then
            assertThat(dto.getName()).isEqualTo(name);
            assertThat(dto.getAmount()).isEqualTo(amount);
        }
    }
  • //given
    :テストするデータ値
  • を設定します.
  • //when
    :テスト内容/シナリオ設定
  • //then
    :テストする期待値の検証
    assertThat:検証するターゲットメソッドパラメータの設定
    isEqualto:同等比較方法