키보드워리어

[스프링] Junit으로 테스트코드 구성해보기 본문

Spring framework/Junit

[스프링] Junit으로 테스트코드 구성해보기

꽉 쥔 주먹속에 안경닦이 2023. 4. 23. 13:02
728x90

Rest Controller코드 테스트 해보기

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

    @GetMapping("/hello/dto")
    public HelloResponseDto helloResponseDto(@RequestParam("name") String name,
                                             @RequestParam("amount") int amount){
        return new HelloResponseDto(name,amount);
    }
}

간단한 경로 /hello 경로와 /hello/dto 매핑 구현시

이를 테스트로 해본다면 다음과 같이 짜볼 수 있음.

 

@RequestParam이란 외부에서 API로 넘긴 파라미터를 가지고 오는 어노테이션.

 

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello")).andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

    @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)));


    }

}

 

1) @RunWith(SpringRunner.class)

테스트를 진행할 때 Junit과 SpringRunner클래스를 연결해 주는 역할

 

2) @WebMvcTest

Web에 집중하게 해 줌, Spring MVC *컨트롤만 사용가능

 

3) private MockMvc mvc

스프링 MVC 테스트 시작점 여러 테스트 진행 가능

 

4) param

API테스트할 요청 파라미터 설정합니다.

하지만 String형만 허용합니다. 그래서 String.valueOf 합니다.

 

Entity 코드 테스트 해보기

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor //매개변수 없는 생성자 생성
@Entity//테이블과 링크됨 Entity클래스에서는 절대 Setter를 구현하지 않음.
//값을 세팅해야하는 경우 그 의도를 명확히하는 메서드를 따로 만들어야합니다.
public class Posts {

    @Id//pk지정, pk는 Long타입 권장
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    //컬럼을 정의할 수 있음. null값 허용하지 않음. @NotNull가능
    private String content;

    private String author;

    @Builder//빌더 생성 가능 많은 생성자가 필요할때 가독성 높임
    public Posts(String title, String content, String author){
        this.title = title;
        this.content = content;
        this.author = author;
    }


}

위와 같은 Entity어노테이션 지정 클래스가 있을 때 테스트 코드를 작성해 보겠습니다.

 

import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)//Junit5부터 ExtendWith사용
@SpringBootTest
public class PostsRepositoryTest {
    @Autowired
PostsRepository postsRepository;
@After
    //@After는 Junit5부터 AfterEach를 사용.
    public void cleanup(){
    postsRepository.deleteAll();
}

@Test
    public void 게시글저장_불러오기(){
    //given
    String title= "테스트 게시글";
    String content = "테스트 본문";

    postsRepository.save(Posts.builder()
            .title(title)
            .content(content)
            .author("admilljk7091@naver.com")
            .build());
    //save는 테이블 posts에 insert/update쿼리를 실행시켜줌.
    //id 없으면 insert,있다면 update실행.
    
    
    //when
    List<Posts> postsList = postsRepository.findAll();
    //테이블 Posts에 모든 데이터 조회
    
    //then
    Posts posts = postsList.get(0);
    assertThat(posts.getTitle()).isEqualTo(title);
    assertThat(posts.getContent()).isEqualTo(content);
}
}

별다른 설정 없이 @SpringBootTest를 사용하면 H2 데이터베이스에 연결됩니다.

 

이번에 배운 점

1) @SpringBootTest어노테이션을 지정하지 않으면 Bean파일에 관리가 안돼서 Repository를 못 찾을 수 있으니 작성해 주시기 바랍니다.

2) Junit5로 바뀌면서 몇 가지 어노테이션이 다를 수 있습니다.

3) chat GPT로 테스트 코드를 작성해 볼 수 있냐고 물어보니 만들어주네요···.

테스트 코드 작성
테스트 코드 작성

 

728x90