繁体   English   中英

Spring单元测试的结果在NoSuchBeanDefinitionException中:没有类型为'org.springframework.mail.javamail.JavaMailSender'的合格bean

[英]Spring unit test results in NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender'

我有这个REST控制器:

package com.company.rest;

@RestController
@RequestMapping("/v1/orders")
public class OrderController {

    @Autowired
    private OrderService orderService;
...

OrderService实现:

package com.company.service.impl;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private MessageService messageService;
...

MessageService实现:

package com.company.service.impl;

import org.springframework.mail.javamail.JavaMailSender;

@Service
public class MessageServiceImpl implements MessageService {

    @Autowired
    public JavaMailSender emailSender;
...

在开发环境中,这很完美,但是我对OrderController进行了单元测试(基于教程):

package com.company.test;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdminApplication.class)
@WebAppConfiguration
public class OrderTest {

    private MockMvc mockMvc;

    @Autowired
    private OrderService orderService;
...

结果是:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

为什么在生产中满足这种依赖性,而在测试中却不能满足? 为了使该单元测试成功注入(或模拟) JavaMailSender实现,我需要做什么?

未创建JavaMailSender Bean,因为Spring测试运行器无法获得所需的配置。 例如,没有spring.mail.hostapplication.properties

解决方案之一是为JavaMailSender添加一个TestConfiguration

@TestConfiguration
public class TestConfigForMail {

  @Bean
  public JavaMailSender mailSender() {
    final JavaMailSenderImpl sender = new MockMailSender();
    return sender;
  }

  private class MockMailSender extends JavaMailSenderImpl {
    @Override
    public void send(final MimeMessagePreparator mimeMessagePreparator) throws MailException {
      final MimeMessage mimeMessage = createMimeMessage();
      try {
        mimeMessagePreparator.prepare(mimeMessage);
        final String content = (String) mimeMessage.getContent();
        final Properties javaMailProperties = getJavaMailProperties();
        javaMailProperties.setProperty("mailContent", content);
      } catch (final Exception e) {
        throw new MailPreparationException(e);
      }
    }
  }
}

注意:MockMailSender的代码来自Fahd Shariff

然后将TestConfiguration导入您的测试用例。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdminApplication.class)
@Import(TestConfigForMail.class)
@WebAppConfiguration
public class OrderTest {

    private MockMvc mockMvc;

    @Autowired
    private OrderService orderService;
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM