![](/img/trans.png)
[英]No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' - Spring MVC
[英]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.host
在application.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.