[에러노트] mokito를 이용한 단위테스트시 겪은 에러 ,AssertJ 의 assertThat 사용

hyewon jeong·2023년 3월 11일
0

에러노트

목록 보기
23/46

1 에러

1 발생


2 코드

  @Test
  @DisplayName("FAQ 수정_성공")
  void updateFaq() {
    //given

    UpdateFaqRequest updateFaqRequest = new UpdateFaqRequest("hello","hello");
    String question = updateFaqRequest.getQuestion();
    String answer = updateFaqRequest.getAnswer();
    Faq faq = new Faq(anyLong(),question,answer);

    //faq.update(question,answer);

    when(faqRepository.findById(anyLong()))
        .thenReturn(Optional.of(faq));

    //when
    faqServiceImpl.updateFaq(anyLong(),anyLong(),updateFaqRequest);
    //verify
    verify(faqRepository,times(1)).save(any(Faq.class));
  }

3 원인

번역해보면
매처를 사용할 때 모든 인수는 매처에서 제공해야 합니다.


4 해결

    Faq faq = new Faq(1L,question,answer);
...
    //when
    faqServiceImpl.updateFaq(1L,1L,updateFaqRequest);

2 에러

1 발생

처음 테스트코드를 사용할때 assertThat으로 잘 검증했는데 두번째 테스트 코드를 작성하면서 assertThat을 사용하면 빨간줄 처리 되며 요구되는 것은 list 형식이라 생긴 빨간줄 이었다. 그럼 왜 그전에는 이런 에러 없이 잘 썼고, 왜 list 형식이지??


2 코드


3 원인

import static org.junit.jupiter.api.Assertions.assertThat;

공식문서
org.junit.Assert.assertThat의 기본 형태는 아래와 같습니다.

public static <T> void assertThat(T actual, Matcher<? super T> matcher)

actual 인자에 검증대상(실행 단계의 결과)을 넣고, 이와 비교하는 로직(matcher)을 주입받아 검증 단계를 수행합니다.


4 해결

org.assertj.core.api.Assertions.assertThat

공식문서
public static AbstractAssert<SELF, T> assertThat(T actual)
assertj의 assertThat은 인자로 actual(검증대상)만 받습니다.

이런 이유로
org.junit.Assert.assertThat 의 형식 대신 org.assertj.core.api.Assertions.assertThat 을 사용하기로 했다.

혹시 assertEquals 사용이 필요한 경우는 org.junit.Assert.assertThat을 사용하면 된다.

AssertJ

  1. AssertJ란?
    AssertJ란 asssertion(직역 : 주장)을 제공하는 자바 라이브러리로 에러 메세지와 테스트 코드의 가독성을 높여주는 라이브러리이다.

junit5에서 제공하는 Assertions의 assert는 인자 순서 (expected, actual)의 순서가 헷갈릴 수 있는데 Assertions보다 가독성이 좋아진다.

assertEquals(expected, actual); 
assertThat(actual).isEqualTo(expected);
  • 메소드 체이닝을 지원하기 때문에 좀 더 깔끔하고 읽기 쉬운 테스트 코드를 작성할 수 있다.
  • 개발자가 테스트를 하면서 필요한 거의 모든 메소드를 제공한다.
  1. 의존성 추가
//maven
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.21.0</version>
    <scope>test</scope>
</dependency>

//gradle
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.21.0'
  1. 메소드 임폴트
import static org.assertj.core.api.Assertions.*;
  1. 테스트 대상 지정
assertThat(테스트 타켓).메소드1().메소드2().메소드3();

참고자료

📌AssertJ 기본 사용법

Unit의 assertThat보다 assertj의 assertThat을 써야하는 이유

profile
개발자꿈나무

0개의 댓글