본문 바로가기
TIL/Spring

23.07.11

by J1-H00N 2023. 7. 11.
  • 테이블 설계 옵션
    1. 카카오 User 를 위한 테이블 (ex. KakaoUser) 을 하나 더 만든다.
      1. 장점: 결합도가 낮아짐
        • 성격이 다른 유저 별로 분리 → 차후 각 테이블의 변화에 서로 영향을 주지 않음
        • 예) 카카오 사용자들만 profile_image 컬럼 추가해서 사용 가능
      2. 단점: 구현 난이도가 올라감
        • 예) 관심상품 등록 시, 회원별로 다른 테이블을 참조해야 함
          • 일반 회원: User - Product
          • 카카오 회원: KakaoUser - Product
    2. 기존 회원 (User) 테이블에 카카오 User 추가
      1. 장점: 구현이 단순해짐
      2. 단점: 결합도가 높아짐
        • 폼 로그인을 통해 카카오 로그인 사용자의 username, password 를 입력해서 로그인한다면??

 

 

단위 테스트

버그는 발견 시간이 늦어질수록 비용이 급격하게 커진다.

단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법

단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘 못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점이 있다.

 

Given - When - Then : Test Code 스타일을 표현하는 방식

Given

  • 테스트 하고자하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언해 둡니다.

When

  • 테스트 하고자하는 대상을 실제로 실행 시킵니다.

Then

  • 어떤 특정한 행동(테스트 대상 실행) 때문에 발생할거라고 예상되는 결과에 대해 예측하고 맞는지 확인합니다.

↓예시코드

더보기
class CalculatorTest {

    Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @Test
    @DisplayName("계산기 연산 성공 테스트")
    void test1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 2;

        // when
        Double result = calculator.operate(num1, op, num2);

        // then
        assertNotNull(result);
        assertEquals(2.5, result);
    }

    @Test
    @DisplayName("계산기 연산 실패 테스트 : 분모가 0일 경우")
    void test1_1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 0;

        // when
        Double result = calculator.operate(num1, op, num2);

        // then
        assertNull(result);
    }

    @Test
    @DisplayName("계산기 연산 실패 테스트 : 연산자가 잘못됐을 경우")
    void test1_2() {
        // given
        int num1 = 5;
        String op = "?";
        int num2 = 2;

        // when - then
        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> calculator.operate(5, "?", 2));
        assertEquals("잘못된 연산자입니다.", exception.getMessage());
    }
}

 

JUnit 5 User Guide

https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

 

 

Mockito

프로젝트에서 service와 같은 기능을 테스트할 때, 서비스 내에서 필요한 repository나 entity 등과 같이 유기적으로 섞여있는 기능 중에서 service만 독립적으로 테스트하고 싶을 때 사용할 수 있는 가짜 객체다.

예시) service를 구현하기 위해 필요한 repository들을 이름만 같게 생성해서, 실제 데이터베이스 작동은 하지 않게 만든 것이다.

@ExtendWith(MockitoExtension.class) // @Mock 사용을 위해 설정합니다.
class ProductServiceTest {

    @Mock
    ProductRepository productRepository;

    @Mock
    FolderRepository folderRepository;

    @Mock
    ProductFolderRepository productFolderRepository;

위와 같이 mock 생성만 하면 사용 케이스를 제대로 작성하지 않았기 때문에 에러가 발생한다.

'TIL > Spring' 카테고리의 다른 글

23.07.25  (0) 2023.07.25
23.07.12  (0) 2023.07.12
23.07.10  (0) 2023.07.10
23.06.21  (0) 2023.06.21
23.06.20  (0) 2023.06.20