250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩초보
- 프로그래밍
- JAVA기초
- 프로그래밍기초
- 기초코딩
- 메소드
- 데이터베이스
- 이클립스
- Git
- 초보코딩
- 자바프로그래밍
- 리눅스
- 클래스
- JShell
- github
- 제이쉘
- 자바 스프링
- 자바기초
- 컴퓨터과학개론
- spring
- 프로그래밍언어
- 스프링
- 스프링 기초
- eclips
- 초보코딩탈출
- 배열
- 자바
- Java
- Elk
- 알고리즘
Archives
- Today
- Total
키보드워리어
[스프링] Junit으로 테스트코드 구성해보기 본문
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