【问题标题】:Mockito with JavaMailSender带有 JavaMailSender 的 Mockito
【发布时间】:2020-03-23 12:39:06
【问题描述】:

我的测试失败了,这是我的测试课。

public class EmailGeneratorServiceTests {

    @Mock
    JavaMailSender javaMailSender;

    EmailGeneratorService emailGeneratorService;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        emailGeneratorService = new EmailGeneratorService(javaMailSender);
    }


    @Test
    public void generateAndSendMessageSuccess() throws MessagingException, IOException {
        String email = "test@test.com";
        String body = "Some contents.";
        String subject = "Some subject";
        emailGeneratorService.generateAndSendMessage(email, body, subject);
        List<Message> inbox = Mailbox.get(email);
        //inbox.size === 0
        assertTrue(inbox.size() == 1);
        assertEquals(subject, inbox.get(0).getSubject());
        assertEquals(body, inbox.get(0).getContent());
    }
}

当我调用 inbox.size() 时,我得到 0,但预期为 1。服务器是 smtp。

这是 EmailGeneratorService。

@Service
public class EmailGeneratorService {
    SimpleMailMessage simpleMailMessage;
    JavaMailSender javaMailSender;

    @Autowired
    public EmailGeneratorService(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
        this.simpleMailMessage = new SimpleMailMessage();
    }

    public void generateAndSendMessage (String email, String messageBody, String subject) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setTo(email);
        simpleMailMessage.setText(messageBody);
        simpleMailMessage.setSubject(subject);
        javaMailSender.send(simpleMailMessage);
    }
}

请写出问题所在并解释问题所在。

【问题讨论】:

    标签: java spring spring-boot mockito


    【解决方案1】:

    您应该捕获JavaMailSender 以获取参数并断言它。

    ArgumentCaptor<SimpleMailMessage> emailCaptor = ArgumentCaptor.forClass(SimpleMailMessage .class);
    verify(javaMailSender, times(1)).send(emailCaptor.capture());
    
    List<SimpleMailMessage> actualList = emailCaptor.getAllValues();
    assertTrue(actualList.size() == 1);
    assertEquals(subject, actualList.get(0).getSubject());
    assertEquals(body, actualList.get(0).getContent());
    

    和用户ErrorCollector 断言多个值,在@Before 方法之前定义它,如下所示:

    @Rule
    public ErrorCollector collector= new ErrorCollector();
    

    ,在断言中这样使用它:

    collector.checkThat(getResult(), equalTo("ERROR!"));
    

    你的测试应该是这样的:

    public class EmailGeneratorServiceTests {
    
        private static final String EMAIL = "test@test.com";
        private static final String BODY = "Some contents.";
        private static final String SUBJECT = "Some subject";
    
        @Mock
        private JavaMailSender javaMailSender;
    
        private EmailGeneratorService emailGeneratorService;
    
        @Rule
        public ErrorCollector collector = new ErrorCollecto();  
    
        @Before
        public void before() {
            MockitoAnnotations.initMocks(this);
            emailGeneratorService = new EmailGeneratorService(javaMailSender);
        }
    
    
        @Test
        public void generateAndSendMessageSuccess() throws Exception {
            // Arrange
            emailGeneratorService.generateAndSendMessage(email, body, subject);
    
            // Act
            Mailbox.get(email);
    
            // Assert
            ArgumentCaptor<SimpleMailMessage> emailCaptor = 
            ArgumentCaptor.forClass(SimpleMailMessage .class);
            verify(javaMailSender, times(1)).send(emailCaptor.capture());
    
            List<SimpleMailMessage> actualList = emailCaptor.getAllValues();
            collector.checkThat(actualList.size(), equalTo(1));
            collector.checkThat(actualList.get(0).getSubject(), equalTo(SUBJECT));
            collector.checkThat(actualList.get(0).getContent(), equalTo(CONTENT));
        }
    }
    

    【讨论】:

    • 你能批准答案吗:D
    • 是否会在您的@Test 中执行 emailGeneratorService 中的 generateAndSendMessage 方法,实际上再次发送电子邮件,就像重复发送一样?
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 2019-07-22
    • 2020-10-05
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2021-01-16
    相关资源
    最近更新 更多