wasup
JUnit) 단위테스트와 통합테스트 본문
반응형
단위테스트
예제
package com.was.waspj.service;
import com.was.waspj.domain.Member;
import com.was.waspj.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach(){
memberRepository.clearStore();
}
@Test
void join() {
//given : 뭔가 주어졌을 때
Member member = new Member();
member.setName("spring");
//when : 실행했을 때
Long saveId = memberService.join(member);
//then : 예상되는 결과
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
//정상테스트도 진행되어야하지만
//예외테스트가 보다 중요함.
@Test
public void 중복회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
/*
memberService.join(member1);
try {
memberService.join(member2);
fail();
}catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("123이미 존재하는 회원입니다.");
}*/
memberService.join(member1);
//assertThrows(IllegalStateException.class, () -> memberService.join(member2));
//assertThrows(NullPointerException.class, () -> memberService.join(member2));
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//then
}
@Test
void findMembers() {
//given : 뭔가 주어졌을 때
//when : 실행했을 때
//then : 예상되는 결과
}
@Test
void findOne() {
//given : 뭔가 주어졌을 때
//when : 실행했을 때
//then : 예상되는 결과
}
}
테스트 어노테이션
@Test : 테스트 어노테이션이 선언된 메서드는 테스트 메서드가 됨.
@Before : @Test메서드가 실행되지 전에 반드시 실행
(*테스트 메서드에서 공통으로 사용하는 코드를 @Before메서드에 선언)
@AfterEach : @Test메서드가 실행된 후 실행
@Commit : 테스트코드가 실행 성공하고 DB에서도 업데이트 된 결과를 확인하기 위해서 사용
테스트 어노테이션
참고 링크1 : https://shlee0882.tistory.com/202
참고링크2 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=writer0713&logNo=221537241239
이전글 JUnit 예제 보기
통합테스트
예제
package com.was.waspj.service;
import com.was.waspj.domain.Member;
import com.was.waspj.repository.MemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
//테스트케이스틑 간편한 방식으로 진행하는 것이 좋다.
//보통 테스트용 DB도 따로 구축.
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void join() {
//given : 뭔가 주어졌을 때
Member member = new Member();
member.setName("spring");
//when : 실행했을 때
Long saveId = memberService.join(member);
//then : 예상되는 결과
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
//정상테스트도 진행되어야하지만
//예외테스트가 보다 중요함.
@Test
public void 중복회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
/*
memberService.join(member1);
try {
memberService.join(member2);
fail();
}catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("123이미 존재하는 회원입니다.");
}*/
memberService.join(member1);
//assertThrows(IllegalStateException.class, () -> memberService.join(member2));
//assertThrows(NullPointerException.class, () -> memberService.join(member2));
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//then
}
}
@SpringBootTest
: 스프링 컨테이너와 테스트를 함께 실행함.
@Transactional
테스트 케이스에 @Transactional이 있으면,
테스트를 실행할 때 Transactional을 먼저 실행하고 (DB에 데이터를 인서트하고)
테스트가 끝나면 Rollback한다.
: DB에 넣은 데이터가 깔끔히 사라져버림.
: 즉, 다음 테스트를 계속해서 진행하기 용이함.(이전 테스트가 다음 테스트에 영향을 주지 않음)
*DB는 기본적으로 Insert쿼리를 날리고 commit(auto commit)을 해줘야 반영이 된다.
반응형
'IT > Java' 카테고리의 다른 글
Spring Legacy MiNi Project - STS / member view (0) | 2021.08.09 |
---|---|
Spring) JDBC / jdbcTemplate / JPA / spring data JPA (0) | 2021.08.08 |
Spring Legacy MiNi Project - STS / member java (0) | 2021.08.05 |
Spring) Note - 개념, 관계, 테스트케이스 JUnit (0) | 2021.07.31 |
Spring) 인텔리제이(IntelliJ)로 스프링 시작해보기 (0) | 2021.07.28 |
Comments