Dodania maila do wiadomości.

0

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?

1
Optional<String> toCc = Optional.ofNullable(mail.getToCc());
toCc.ifPresent(mailMassage::setCc);

To jest bez sensu. Optionalem ma być pole w klasie. Wtedy nie musisz tego dodatkowo wrappować w Optional.

Najpierw napisz w pseudokodzie, jaki test chcesz napisać, co chcesz sprawdzić. Może da się to sprawdzić łatwiej niż ArgumentCaptor na mocku. Zacznij od nazwy testu, when i then. Zrób to jak najprościej.

0

To jest bez sensu. Optionalem ma być pole w klasie. Wtedy nie musisz tego dodatkowo wrappować w Optional.

@Charles_Ray: Chce napisać warunek, który będzie sprawdzał czy pole ma adres mailowy, i jeśli ma to niech dodaje jako dodatkowy odbiorca. Kombinowałem z czymś takiem jeszcze: mail.getToCc().ifPresent(cc -> mailMessage.setCc(cc)); ale znowu, nie wiem czy to jest dobrze i nie wiem jak do tego napisać testy... :/

0

Tak jest ok, w końcu wykorzystujesz fakt, że to pole jest Optionalem

1 użytkowników online, w tym zalogowanych: 0, gości: 1