无法模拟 Logger

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

我正在尝试模拟 @Slf4j 为我的单元测试之一提供的记录器。但我做不到。

以下是我正在使用的代码示例。

我的服务代码

package com.someorg;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
@RequiredArgsConstructor
@Slf4j
public class EmailNotificationService implements NotificationService {

    private final JavaMailSender javaMailSender;

    @Value("${spring.mail.from}")
    private String from;

    public void send(String content, String subject, Set<String> receivers){
        // Sends HTML email to Set of receivers
        MimeMessage message = javaMailSender.createMimeMessage();
        try{
            MimeMessageHelper messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,true);
            messageHelper.setTo(receivers.toArray(new String[0]));
            messageHelper.setFrom(from);
            javaMailSender.send(message);
        }catch(MessagingException | RuntimeException e){
            log.warn("Error while sending email notification with subject %s".formatted(subject),e);
        }
    }
}

我的测试文件

package com.someorg;

import jakarta.mail.internet.MimeMessage;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.mail.MailSendException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.test.context.TestPropertySource;

import java.util.Collections;
import java.util.Set;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


@SpringBootTest(classes = {EmailNotificationService.class})
@TestPropertySource(properties = {"[email protected]"})
class EmailNotificationServiceTest {

    @MockBean
    private JavaMailSender javaMailSender;
    @Mock
    private MimeMessage mimeMessage;
    @Mock
    Logger logger;
    @Autowired
    private EmailNotificationService emailNotificationService;
    private static final String CONTENT = "Test content";
    private static final String SUBJECT = "Test subject";
    private static final Set<String> RECEIVERS = Collections.singleton("[email protected]");

  
    @Test
    void testSendWithException(){
        // Arrange
        when(javaMailSender.createMimeMessage()).thenReturn(mimeMessage);
        doThrow(new MailSendException("Simulated exception")).when(javaMailSender).send(mimeMessage);
        // Act
        emailNotificationService.send(CONTENT, SUBJECT, RECEIVERS);
        // Assert
        verify(javaMailSender).send(any(MimeMessage.class));
        verify(logger).warn(any(String.class), any(MailSendException.class));
    }
}

我的电子邮件通知服务没有模拟测试文件中 Logger 提供的记录器。我收到的错误为enter image description here

我通过删除@Autowired和其他不同的东西尝试了不同的东西,但它不起作用。

spring-boot unit-testing logging mockito slf4j
1个回答
0
投票

也许你可以尝试 Captor,比如:

@Captor
protected ArgumentCaptor<Logger> logger;

还要断言正在抛出错误,也许你可以这样做

Assertions.assertThrows(MailSendException.class, () -> emailNotificationService.send(CONTENT, SUBJECT, RECEIVERS));
© www.soinside.com 2019 - 2024. All rights reserved.