Springboot测试无法在Junit 5中加载ApplicationContext

时间:2019-04-03 20:07:43

标签: java spring-boot junit5

我正在尝试使用Junit5针对特定的服务类创建单元/集成测试,以避免使整个项目过载。

所以在这里,我尝试运行EmailService及其相关类,但得到java.lang.IllegalStateException: Failed to load ApplicationContext. Error creating bean with name 'emailSenderService. No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate.'

我是否必须运行整个应用程序才能测试单个服务?

build.yml

{
    testImplementation ('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation "org.junit.jupiter:junit-jupiter:5.4.1"
}

服务:

public class EmailSenderService {
    private final JavaMailSender sender;
    private final SpringTemplateEngine templateEngine;
    private final MessageSource i18n;
    public EmailSenderService(JavaMailSender sender, SpringTemplateEngine templateEngine,
                              @Qualifier("messageSource") MessageSource i18n) {
        this.sender = sender;
        this.templateEngine = templateEngine;
        this.i18n = i18n;
    }
}

测试课程:

@SpringBootTest(
        classes = {EmailSenderService.class}
)
@ExtendWith({SpringExtension.class})
class EmailServiceTest {

    private static GreenMail smtp;

    @Autowired
    private EmailSenderService mailService;

    @BeforeAll
    static void init() {
        smtp = new GreenMail(new ServerSetup(3026,null,"smtp"));
        smtp.start();
    }

    @AfterAll
    static void tearDown() {
        smtp.stop();
    }

    @BeforeEach
    void clearUp() throws FolderException {
        smtp.purgeEmailFromAllMailboxes();
    }

    @Test
    void testNewBidRequestEmail() throws MessagingException {
        EmailMessageTemplateDto contact = new EmailMessageTemplateDto("test","test@test.com","test message");
        mailService.sendUserContactEmail(contact);
        Assertions.assertTrue(smtp.waitForIncomingEmail(1));
    }
}

错误:

  

2019-04-03 14:56:06.146 WARN 732 --- [main]   o.s.w.c.s.GenericWebApplicationContext:遇到异常   在上下文初始化期间-取消刷新尝试:   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为'emailSenderService'的bean时出错:不满意   通过构造函数参数0表示的依赖关系;嵌套异常   是org.springframework.beans.factory.NoSuchBeanDefinitionException:否   类型的合格豆   “ org.springframework.mail.javamail.JavaMailSender”可用:预期   至少1个符合自动装配候选条件的bean。相依性   注释:{} 2019-04-03 14:56:06.153错误732 --- [
  main] o.s.b.d.LoggingFailureAnalysisReporter:

     

********************************应用程序无法启动

     
     

说明:

     

构造函数的参数0   com.server.server.service.EmailSenderService需要一个Bean   键入“ org.springframework.mail.javamail.JavaMailSender”无法   被发现。

     

操作:

     

考虑定义一个类型的bean   您的“ org.springframework.mail.javamail.JavaMailSender”   配置。

     

2019-04-03 14:56:06.159错误732 --- [main]   o.s.test.context.TestContextManager:捕获异常   允许TestExecutionListener   [org.springframework.test.context.web.ServletTestExecutionListener@342c38f8]   准备测试实例   [com.server.server.test.junit.EmailServiceTest@4c7a078]

     

java.lang.IllegalStateException:无法在以下位置加载ApplicationContext   org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)   〜[spring-test-5.1.5.RELEASE.jar:5.1.5.RELEASE]在   org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)   ...

1 个答案:

答案 0 :(得分:1)

问题是您确实没有JavaMailSender可用(并且您在测试期间不希望有一个真实的)。您有四个选择:

  • 在测试配置中注册模拟/存根JavaMailSender bean。

  • 使用自动配置使您的EmailSenderService本身@ConditionalOnBean(JavaMailSender.class)并在没有存根的情况下注册一个存根(这通常是我要进行的测试“系统是否发送交易邮件吗?”。

  • 在这种情况下,由于您实际上是在测试EmailSenderService本身,因此请在spring.mail.host: localhost属性(或注释)中设置application-test

  • 这里完全不使用Spring DI。构造函数注入的主要优点是,您可以手动实例化bean,并且可以new EmailSenderService及其依赖项。

如果我了解您打算参加的考试范围,则#3可能是适合您的解决方案。