@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));
}
번역해보면
매처를 사용할 때 모든 인수는 매처에서 제공해야 합니다.
Faq faq = new Faq(1L,question,answer);
...
//when
faqServiceImpl.updateFaq(1L,1L,updateFaqRequest);
처음 테스트코드를 사용할때 assertThat으로 잘 검증했는데 두번째 테스트 코드를 작성하면서 assertThat을 사용하면 빨간줄 처리 되며 요구되는 것은 list 형식이라 생긴 빨간줄 이었다. 그럼 왜 그전에는 이런 에러 없이 잘 썼고, 왜 list 형식이지??
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)을 주입받아 검증 단계를 수행합니다.
공식문서
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을 사용하면 된다.
junit5에서 제공하는 Assertions의 assert는 인자 순서 (expected, actual)의 순서가 헷갈릴 수 있는데 Assertions보다 가독성이 좋아진다.
assertEquals(expected, actual);
assertThat(actual).isEqualTo(expected);
//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'
import static org.assertj.core.api.Assertions.*;
assertThat(테스트 타켓).메소드1().메소드2().메소드3();
참고자료