9

我在这里做错了什么?我的理解是 Spring 应该按照其自动装配 EventRepository 的方式自动装配 JavaMailSender。有什么指导吗?

application.properties 和 application-test.properties

mail.host='smtp.gmail.com' -
mail.port=587
mail.username=username
mail.password=password
mail.properties.mail.smtp.starttls.enable=true

我的实现类:如果我运行我的应用程序,这很好用

      @Service
            public class EventService {
             private EventRepository eventRepository;
             private JavaMailSender javaMailSender;

                public EventService(EventRepository eventRepository, JavaMailSender   javaMailSender) {
                    this.eventRepository = eventRepository;
                    this.javaMailSender = javaMailSender;
                }

                public Event send(Event event) {
                   SimpleMailMessage message = new SimpleMailMessage();
                    message.setText("");
                    message.setSubject("");
                    message.setTo("");
                    message.setFrom("");
                    javaMailSender.send(message);
                    return eventRepository.save(event);
                }

            }

我的集成测试类:能够自动装配 EventRepository 但不能使用 JavaMailSender。

       @RunWith(SpringRunner.class)
        @SpringBootTest
        public class ApplicationIntegrationTests {
            @Autowired
            private EventService eventService;

         @Test
            public void test() throws Exception {
                eventService.save(new Event());
        }

        }

错误:

Caused by: 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: {}
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
4

7 回答 7

2

请确保您的测试与package您的主@SpringBootApplication类相同。

例如,如果@SpringBootApplication上课在,src/main/java/some/package那么你@SpringBootTest需要在src/test/java/some/package。如果不是,则需要显式设置@ComponentScan为 include some.package。您也可以使用@SpringBootTest(classes=...), @ContextConfiguration(classes=...)}

您还可以@SpringBootConfiguration在您的测试包中放置一个类来扫描您的主包。

于 2017-03-06T14:57:07.793 回答
2

在我的情况下,这是由 main 和 test 资源中的 application.properties 文件的差异引起的。

测试文件中缺少以下属性:

spring.mail.host=<my host>
spring.mail.port=<my port>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

请注意,在单元测试中使用外部服务并不是最好的主意。

于 2018-09-20T09:09:32.190 回答
0

确保 SpringBoot 类和 Test 类具有相同的包名

于 2021-07-02T04:49:59.780 回答
0

您的对象应正确配置。
使用 'JavaMailSenderImpl' 代替,使用以下任何一种方式声明您的 @Bean,

@Autowired
private JavaMailSenderImpl mailSender;

或者

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
于 2021-07-02T09:52:37.967 回答
0

你需要创建一个bean。就像你的配置包中的下面一样(如果你有的话)。

@Bean
public JavaMailSender getJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.gmail.com");
    mailSender.setPort(587);
    
    mailSender.setUsername("my.gmail@gmail.com");
    mailSender.setPassword("password");
    
    Properties props = mailSender.getJavaMailProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.debug", "true");
    
    return mailSender;
}

并将@Configuration注解放在类上面

于 2021-03-27T06:14:29.093 回答
0

自动装配规则:只有两个,我说ONLY TWO自动装配有可能抛出空值。

  1. NEW您使用关键字手动创建了对象。在 IoC 框架环境中,您应该让框架做它的狗屎。

例如private AnyMailSender mail = new AnyMailSender()

  1. 某些对象可能未自动装配。在你的情况下,你不是自动装配这条线

private JavaMailSender javaMailSender;

你应该做这样的事情

@Autowire private JavaMailSender javaMailSender;

于 2019-08-23T06:41:03.600 回答
0

您应该定义属性之一spring.mail.hostspring.mail.jndi-name用于 spring 自动配置或在配置类中定义您自己的 bean。

检查这个类org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration的详细信息。

例子:

@Service
public class MyEmailService {

    @Autowired
    private JavaMailSender mailSender;

}
import org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration;

@RunWith(SpringRunner.class)
@SpringBootTest(
   properties = "spring.mail.host=localhost", // <--- inlined property
   classes = {MyEmailService.class, MailSenderAutoConfiguration.class}
)
public class MyEmailServiceTest {

    @Autowired
    private MyEmailServiceTest emailService;

    @Autowire 
    private JavaMailSender javaMailSender; // if you need

    @Test
    public void validEmails() {
        // some tests of emailService
    }
}
于 2021-01-29T13:14:40.730 回答