我有一个使用 Java 17 和 Spring 3 的项目。在我的 pom.xml 中,测试扩展如下:
我有以下课程:
@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)
¿有谁知道如何解决吗??
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));
}
}