当前位置: 首页 > 知识库问答 >
问题:

Springboot测试在Junit 5中加载ApplicationContext失败

鄢翰藻
2023-03-14

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

{
    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警告732---[main]O.S.W.C.S.GenericWebApplicationContext:上下文初始化过程中遇到异常-取消刷新尝试:org.springframework.beans.factory.unsatisfiedDependencyException:创建名为“email senderservice”的bean时出错:通过构造函数参数0表示未满足的依赖关系;嵌套异常是org.springframework.beans.factory.NosuchBeanDefinitionException:没有类型为'org.springframework.mail.javamail.javamailSender'的合格bean可用:至少需要1个符合autowire候选的bean。依赖项批注:{}2019-04-03 14:56:06.153错误732---[
main]O.S.B.D.LoggingFailureAnalysisReporter:

行动:

考虑在您的配置中定义一个类型为'org.springframework.mail.javamail.JavaMailSender'的bean。

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]时捕获异常

共有1个答案

姜弘新
2023-03-14

问题是您实际上没有可用的JavaMailSender(而且在测试过程中您也不希望有一个真正的JavaMailSender)。您有四种选择:

>

  • 在测试配置中注册mock/stubJavaMailSenderbean。

    使用自动配置使您的emailsenderservice自身@conditionalonbean(javamailsender.class)并注册一个存根(这通常是我在测试“系统发送事务性邮件吗?”时所做的)。

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

    如果我理解测试的预期范围,那么#3可能是适合您的解决方案。

  •  类似资料:
    • 我使用spring网站制作了我的项目,有以下选项:-gradle项目,java,spring启动版本2.4.5,java版本8,依赖项:-spring Web,Thymeleaf,spring数据API

    • 我从不编写集成测试,不明白我做错了什么?会是什么问题?按照我的理解,我应该像这样添加@componentscan或smth?

    • 我有这个问题,知道吗?我正在添加洞迹 我的代码如下所示: 我的文件夹目录如下所示: 堆栈跟踪:

    • 我正在迁移到JUnit5,我想知道在JUnit5中是否有一种简单的方法可以知道测试何时失败,就像我们在使用TestWatcher的JUnit4中那样。 我做了一些研究,发现了一些类似的问题,但仍未解决,比如这样一个问题:https://github.com/junit-team/junit5/issues/542因为大多数问题都很老,所以我想问一下,以防最近有一个解决方案。 想法是能够做一个屏幕截

    • 以下是错误消息 java.lang.IllegalStateException:无法加载ApplicationContext 一个使用elasticSearch、mysql、redis等的Spingboot项目,谷歌有很多,但他只是一个新的Spingboot。网上的东西不管用。我不知道怎么改。 application-local.yml 应与ES的配置相关 控制器

    • 我用JPA Hibernate开发了一个SpringBoot应用程序,它运行得非常好。现在我不得不从测试开始,我真的不知道如何解决这个错误: 我的PlayersRepository是: 我见过这个答案,但没有找到解决方法。我应该更改或添加什么?以前从没用过这种东西,请好心点。