java.lang.IllegalArgumentException:发件人地址不得为空

问题描述 投票:0回答:1

我有一个使用 Java 17Spring 3 的项目。在我的 pom.xml 中,测试扩展如下:

  • junit-jupiter:版本 5.10.1。
  • mockito-core:版本 5.8.0。
  • mockito-junit-jupiter:版本 5.8.0

我有以下课程:

@Service
public class MailServiceImpl implements MailService {

    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.senderUsername}")
    private String mailSenderUsername;

    @Override
    public void sendMailConfirmationToken(MailSimpleRequest mailRequest) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");

        message.setFrom(mailSenderUsername);
        message.setTo(mailRequest.toUsers());
        message.setSubject(mailRequest.subject());
        message.setText("<div><p>Message</p></div>", true);

        this.mailSender.send(mimeMessage);
    }

}

我正在做以下测试:

@ExtendWith(MockitoExtension.class)
class MailServiceImplTest {

    @Mock
    private JavaMailSender mailSender;

    @Mock
    private MimeMessage mimeMessage;

    @Mock
    private MimeMessageHelper mimeMessageHelper;

    private final MailSimpleRequest mailRequest = Data.givenMailRequest();

    @InjectMocks
    private MailServiceImpl mailService;

    @Test
    void sendMailConfirmationToken() throws MessagingException {
        when(mailSender.createMimeMessage()).thenReturn(mimeMessage);

        mailService.sendMailConfirmationToken(mailRequest);

        verify(mailSender).send(any(MimeMessage.class));
    }
}

当我验证测试时,它给出以下错误:

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

java.lang.IllegalArgumentException: From address must not be null

    at org.springframework.util.Assert.notNull(Assert.java:172)
    at org.springframework.mail.javamail.MimeMessageHelper.setFrom(MimeMessageHelper.java:571)
    at ms.mailsender.service.impl.MailServiceImpl.sendMailConfirmationToken(MailServiceImpl.java:40)
    at ms.mailsender.service.impl.MailServiceImplTest.sendMailConfirmationToken(MailServiceImplTest.java:52)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

¿有谁知道如何解决吗??

java spring testing junit mockito
1个回答
0
投票
The error you're encountering is related to the setFrom method of the MimeMessageHelper class. The error message "From address must not be null" indicates that the mailSenderUsername value is null when the setFrom method is called. In your test case, you're not mocking the @Value("${mail.senderUsername}") field, which means that it will have its default value of null. To fix this issue, you can either: –

@ExtendWith(MockitoExtension.class)
class MailServiceImplTest {
    // ...

    @Mock
    private MailServiceImpl mailServiceImplMock;

    @InjectMocks
    private MailServiceImpl mailService;

    @Test
    void sendMailConfirmationToken() throws MessagingException {
        when(mailSender.createMimeMessage()).thenReturn(mimeMessage);
        when(mailServiceImplMock.getMailSenderUsername()).thenReturn("[email protected]");

        mailService.sendMailConfirmationToken(mailRequest);

        verify(mailSender).send(any(MimeMessage.class));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.