[ SourceCode 참고]

https://github.com/jjangsky/Testing-study

요구 사항

추가 Entity 설정

요구 사항에 맞춰 메일 발송 후, 관련 내용을 DB에 저장해야 하므로 새로운 Entity 생성

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class MailSendHistory extends BaseEntity {

    @Id
    @GeneratedValue(strategy =  GenerationType.IDENTITY)
    private Long id;
    private String fromEmail;
    private String toEmail;
    private String subject;
    private String content;
}

Production Code

MailsendClient의 sendEmail는 메일을 발송하는 로직을 갖고있는 Method 이지만, 이번 Test에서는 메일을 발송했다는 가정을 두고 직접 로직 구현X

OrderStatisticsService Business Code

@Transactional
public  boolean sendOrderStatisticsMail(LocalDate orderDate, String email){
    // 해당 일자에 결제완료된 주문들을 가져와서
    List<Order> orders = orderRepository.findOrdersBy(
            orderDate.atStartOfDay(),
            orderDate.plusDays(1).atStartOfDay(),
            OrderStatus.PAYMENT_COMPLETED
    );

    // 총 매출 합계를 계산하고
    int totalAmount = orders.stream()
            .mapToInt(Order::getTotalPrice)
            .sum();

    // 메일 전송
    boolean result = mailService.sendMail("[email protected]",
            email,
            String.format("[매출통계] %s", orderDate),
            String.format("총 매출 합계는 %s원 입니다.", totalAmount)
    );

    if(!result){
        throw new IllegalArgumentException("매출 통계 메일 전송에 실패했습니다.");
    }
    return true;
}

MailService Business Code