inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

워밍업 클럽 3기 BE 클린코드&테스트 - Day18 미션

양종문
0

@Mock

@Mock
private Dependency dependency;

@InjectMocks
private SomeService someService;

 

@MockBean

@SpringBootTest
public class SomeServiceIntegrationTest {
    @MockBean
    private Dependency dependency;

    @Autowired
    private SomeService someService;
}

 

@Spy

// 서비스 로직
public boolean sendMail(String fromEmail, String toEmail, String subject, String contents) {

        boolean result = mailSendClient.sendMail(fromEmail, toEmail, subject, contents);
        if (result) {
            mailSendHistoryRepository.save(MailSendHistory.builder()
                .fromEmail(fromEmail)
                .toEmail(toEmail)
                .subject(subject)
                .contents(contents)
                .build()
            );

            mailSendClient.a();
            mailSendClient.b();
            mailSendClient.c();

            return true;
        }

    return false;
}

// 테스트 코드
@Spy
private MailSendClient mailSendClient;

@DisplayName("메일 전송 테스트")
@Test
void sendMail() {
    // given (mailSendClient.sendMail의 sendMail만 Mocking)
    doReturn(true)
        .when(mailSendClient)
        .sendMail(anyString(), anyString(), anyString(), anyString());
}

 

@SpyBean

@SpringBootTest
public class MyServiceTest {
    @SpyBean
    private MyDependency myDependency;

    @Autowired
    private MyService myService;
}

 

@InjectMocks

@Mock
private Dependency dependency;

@InjectMocks
private SomeService someService;

// dependency가 자동으로 someService에 주입됩니다.

@BeforeEach, given절, when절 적절한 배치

@BeforeEach 
void setUp() {
    1-1, 2-1. 사용자 생성에 필요한 내용 준비
    1-2, 2-2. 사용자 생성
    1-3, 2-3. 게시물 생성에 필요한 내용 준비
    1-4, 2-4. 게시물 생성
} 

@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
    // given
    1-5. 댓글 생성에 필요한 내용 준비

    // when
    1-6. 댓글 생성

    // then
    검증
}

@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
    // given
    2-5. 댓글 생성에 필요한 내용 준비
    2-6. 댓글 생성

    // when
    2-7. 댓글 수정

    // then
    검증
}

@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
    // given
    3-1. 사용자1 생성에 필요한 내용 준비
    3-2. 사용자1 생성
    3-3. 사용자2 생성에 필요한 내용 준비
    3-4. 사용자2 생성
    3-5. 사용자1의 게시물 생성에 필요한 내용 준비
    3-6. 사용자1의 게시물 생성
    3-7. 사용자1의 댓글 생성에 필요한 내용 준비
    3-8. 사용자1의 댓글 생성

    // when
    3-9. 사용자2가 사용자1의 댓글 수정 시도

    // then
    검증
}

백엔드 워밍업클럽

답변 0