Cześć, mam za zadanie zaimplementuj możliwość dodawania pola CC w wysyłanych mailach.
A to jest to co mam zrobić w zadaniu:
Stwórz nowe pole w klasie Mail pod tytułem toCc
, które będzie przechowywać adres email.
Następnie wzbogać naszą klasę SimpleMailMessage
o dodanie wartości do jego pola toCc
za pomocą metody setCc()
Napisz warunek, stanowiący, że jeżeli pole toCc
klasy Mail będzie puste, to nie zostanie ustawiony dodatkowy odbiorca (możesz skorzystać tutaj z Optional
i metody isPresent()
).
Dodatkowe zadanie: przypomnij sobie wzorzec projektowy "Builder". Spróbuj użyć samodzielnie adnotacji @Builder
z Lomboka i użyć jej do budowania obiektów klasy Mail
zamiast konstruktora wieloargumentowego.
I teraz co napisałem:
Klasa Mail:
package com.crud.tasks.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
@AllArgsConstructor
public class Mail {
private final String mailTo;
private final String subject;
private final String message;
private final String toCc;
}
Klasa SimpleEmailService:
package com.crud.tasks.service;
import com.crud.tasks.domain.Mail;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Slf4j
@Service
@RequiredArgsConstructor
public void send(final Mail mail) {
public class SimpleEmailService {
private final JavaMailSender javaMailSender;
public void send(final Mail mail) {
log.info("Starting email preparation...");
try {
SimpleMailMessage mailMessage = createMailMessage(mail);
javaMailSender.send(mailMessage);
log.info("Email has been sent.");
} catch (MailException e) {
log.error("Failed to process email sending: " + e.getMessage(), e);
}
}
private SimpleMailMessage createMailMessage(final Mail mail) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(mail.getMailTo());
//chodzi o ten warunek
if (Optional.ofNullable(mail.getToCc()).isPresent()) {
mailMessage.setCc(mail.getToCc());
log.info("Mail with toCc: " + mail.getToCc());
}
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
return mailMessage;
}
}
I klasa testowa:
package com.crud.tasks.service;
import com.crud.tasks.domain.Mail;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
@ExtendWith(MockitoExtension.class)
class SimpleEmailServiceTest {
@InjectMocks
private SimpleEmailService simpleEmailService;
@Mock
private JavaMailSender javaMailSender;
@Test
public void shouldSendEmail() {
//Given
Mail mail = new Mail("[email protected]", "Test", "Test Message", "");
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(mail.getMailTo());
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
//When
simpleEmailService.send(mail);
//Then
verify(javaMailSender, times(1)).send(mailMessage);
}
@Test
void shouldSendEmailWithToCc() {
//Given
Mail mail = Mail.builder()
.mailTo("[email protected]")
.subject("Test")
.message("Test Message")
.toCc("[email protected]")
.build();
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(mail.getMailTo());
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
mailMessage.setCc(mail.getToCc());
//When
simpleEmailService.send(mail);
//Then
verify(javaMailSender, times(1)).send(mailMessage);
}
}
Próbowałem pisać ten warunek w ten sposób:
if (mail.getToCc() != null) {
mailMessage.setCc(mail.getToCc());
log.info("Mail with toCc: " + mail.getToCc());
}
I jeszcze tak:
Optional<String> toCc = Optional.ofNullable(mail.getToCc());
toCc.ifPresent(mailMassage::setCc);
I jest źle, znaczy testy przechodzi, ale zadanie jest źle wykonane. Z tego co wiem pole toCc
w klasie Mail
powinno być private Optional<String> toCc;
No i ok, ale jak napisać warunek do tego pola i testy?