강의

멘토링

로드맵

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của tanco
tanco

câu hỏi đã được viết

Trong thực tế! Sử dụng Spring Boot và JPA1 - Phát triển ứng dụng Web

Kiểm tra chức năng thành viên

JUnit5 사용하시는 분들은 이렇게...

Viết

·

6.6K

53

JUnit5에서는 @SpringBootTest에 @RunWith(SpringRunner.class)가 포함되어있고, public을 명시해주지 않으셔도 됩니다.

@Test(expected)는 4보다 귀찮아졌네요..

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
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.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
class MemberServiceTest
{
	@Autowired
	MemberService memberService;

	@Autowired
	MemberRepository memberRepository;

	@Test
	void 회원가입() throws Exception
	{
		//given
		Member member = new Member();
		member.setName("1hoon");

		//when
		Long joinId = memberService.join(member);

		//then
		assertEquals(member, memberRepository.findOne(joinId));
	}

	@Test
	void 중복_회원_예외() throws Exception
	{
		//given
		String name = "1hoon";

		Member memberA = new Member();
		memberA.setName(name);

		Member memberB = new Member();
		memberB.setName(name);

		//when
		memberService.join(memberA);

		//then
		IllegalStateException thrown = assertThrows(IllegalStateException.class, () -> memberService.join(memberB));
		assertEquals("이미 존재하는 회원입니다.", thrown.getMessage());
	}
}
spring-bootJPA웹앱springjava

Quiz

71% người trả lời sai. Hãy thử ngay!

JPA에서 SQL과 JPQL 쿼리의 주요 차이점은 무엇인가요?

성능 최적화 방식

데이터 타입 지원 범위

테이블 기반 vs 엔티티 객체 기반

파라미터 바인딩 방식

Câu trả lời 9

6

tanco님의 프로필 이미지
tanco
Người đặt câu hỏi

//정창훈 님

제 개인적인 생각으로는 JUnit5를 사용하시는 게 더 맞지않나 싶습니다.

위 코드에서 사용하기 귀찮게 느껴진 것이지, JUnit4의 @Test 보다 JUnit5의 exception 테스트가 좀 더 상세한 테스팅이 가능하기 때문에, 문법이 퇴보한 건 아니라고 생각해요ㅎㅎ

그리고 저도 JUnit5를 많이 접해보지 못해서 저렇게 코드가 나왔지만, 얼마든지 더 세련되게 작성할 수 있다고 생각합니다ㅎㅎ

2

yh님의 프로필 이미지
yh
Người chia sẻ kiến thức

ㅎㅎ Junit5를 사용하시는 분들께 도움이 되겠네요. 고맙습니다^^

1

JUnit5 사용 시 아래와 같이 하면 두번째 회원(중복회원) join 시 예외 발생 여부를 검증하므로 expect를 간단하게 대체할 수 있습니다.

// 첫번째 회원 가입
memberService.join(member1);
        
// 중복 예외가 발생하는 부분
Assertions.assertThrows(IllegalStateException.class, () -> memberService.join(member2));

// 위에서 예외 발생 여부를 검증하므로 삭제
// Assertions.fail("예외가 발생해야 합니다.");

1

하나 첨언하면 중복회원 예외 테스트에 assertEquals 메소드 안써도 테스트 통과 됩니다. assertThrows 써서 원하는 예외가 발생하는지 바로 확인할 수 있어요. 

assert 테스트 시점에 어떤 예외가 발생하기를 기대하는지 바로 볼 수 있는 게 좋은 거 같아요. 여러 예외를 테스트 해야하는 경우에도 좋고요.

1

아래 링크 참고하시면 Junit5에 대한 이해도가 더 높아질 것 같아요. (인프런에서 스프링 강의 하시는 다른 강사님께서 올리신 글이에요!)

https://www.whiteship.me/springboot-no-more-runwith/

0

이제 Junit5 사용하고 있는데

@Test()
    public void 중복_회원_예외() throws Exception {

        assertThrows(IllegalStateException.class, () -> {
            // given
            Member member1 = new Member();
            member1.setName("kim1");

            Member member2 = new Member();
            member2.setName("kim1");

            // when
            memberService.join(member1);
            memberService.join(member2);

          
            // then
            fail("예외가 발생해야 한다.");
        });

 

이렇게 전체 구문을 감싸는게 보기에 더 깔끔해 보이는 데 다른 분들은 어떻게 사용하시나요 ?

혹시 Junit5 잘 사용하고 계신분 있으신지 궁금하여 올립니다 ~

JUnit5를 사용한다면 위와같이 사용하는것이 좋아보입니다

assertThatThrownBy는 AssertJ에서 지원하는 문법이며 외에도 assertThatIllegalArgumentException()와 같이 자주 사용되는 예외에 대해서도 직접적으로 테스트할 수 있습니다.

개인적으로는 전체를 감싸기보단 예외를 검증해야하는 then에서 사용하는것이 좋아보입니다!

0

감사합니다.

0

오~ 감사합니다!

0

음.... 뭘 써야하는 거지... 문법이 더 퇴보한 거 같은데요...?

Hình ảnh hồ sơ của tanco
tanco

câu hỏi đã được viết

Đặt câu hỏi