ArgumentCaptor 사용법

강찬우·2023년 11월 22일

혼자공부

목록 보기
10/14
@SpringBootTest
class AnswerServiceTest {

    @InjectMocks
    AnswerService answerService;

    @Mock
    AnswerRepository answerRepository;


    @Test
    void create() {
        Question question = new Question();
        String answerContent = "This is an answer content";
        answerService.create(question, answerContent);


        ArgumentCaptor<Answer> answerCaptor = ArgumentCaptor.forClass(Answer.class);

        verify(answerRepository, times(1)).save(answerCaptor.capture());

        Answer savedAnswer = answerCaptor.getValue();

        assertEquals(answerContent, savedAnswer.getContent());
        assertNotNull(savedAnswer.getCreateDate());
        assertEquals(question, savedAnswer.getQuestion());



    }
}
  1. @SpringBootTest: 이 어노테이션은 스프링 부트 애플리케이션을 테스트하기 위한 통합 테스트를 지원한다. 이 어노테이션이 붙은 클래스는 스프링 부트 애플리케이션의 컨텍스트를 로드하고, 테스트 시에 실제 애플리케이션과 유사한 환경을 제공한다.

  2. @InjectMocks: 이 어노테이션은 Mockito에서 제공하는 어노테이션으로, 테스트 대상이 되는 객체에 Mock 객체를 주입한다. 여기서는 AnswerService 객체가 테스트 대상이며, @Mock으로 설정된 AnswerRepository가 주입된다.

  3. @Mock: 이 어노테이션은 Mockito에서 제공하는 어노테이션으로, Mock 객체를 생성한다. 여기서는 AnswerRepository에 대한 Mock 객체를 생성한다.

  4. @Test: 이 어노테이션은 JUnit에서 제공하는 어노테이션으로, 해당 메소드를 테스트 메소드로 실행하도록 지정한다.

  5. answerService.create(question, answerContent): AnswerService 객체의 create 메소드를 호출하여 새로운 Answer를 생성하고, 이를 AnswerRepository를 통해 저장한다.

  6. ArgumentCaptor<Answer> answerCaptor = ArgumentCaptor.forClass(Answer.class);: Answer 객체를 캡처하기 위한 ArgumentCaptor를 생성한다. 이는 후에 save 메소드에 전달된 Answer 객체를 검증할 때 사용된다.

  7. verify(answerRepository, times(1)).save(answerCaptor.capture());: Mockito를 사용하여 AnswerRepositorysave 메소드가 1번 호출되었는지를 검증한다. 동시에 Answer 객체를 answerCaptor에 캡처한다.

  8. Answer savedAnswer = answerCaptor.getValue();: answerCaptor를 사용하여 save 메소드에 전달된 Answer 객체를 가져온다.

  9. assertEquals(answerContent, savedAnswer.getContent());: 저장된 Answer 객체의 content 속성이 예상한 값과 일치하는지 검증한다.

  10. assertNotNull(savedAnswer.getCreateDate());: 저장된 Answer 객체의 createDate 속성이 null이 아닌지 검증한다.

  11. assertEquals(question, savedAnswer.getQuestion());: 저장된 Answer 객체의 question 속성이 예상한 Question 객체와 일치하는지 검증한다.

이러한 테스트 코드는 AnswerServicecreate 메소드가 예상대로 동작하고, AnswerRepositorysave 메소드가 올바르게 호출되는지를 확인한다. 또한, Answer 객체의 내용이 올바르게 설정되었는지도 검증한다.

0개의 댓글