我正在尝试使用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) ...
答案 0 :(得分:1)
问题是您确实没有JavaMailSender
可用(并且您在测试期间不希望有一个真实的)。您有四个选择:
在测试配置中注册模拟/存根JavaMailSender
bean。
使用自动配置使您的EmailSenderService
本身@ConditionalOnBean(JavaMailSender.class)
并在没有存根的情况下注册一个存根(这通常是我要进行的测试“系统是否发送交易邮件吗?”。
在这种情况下,由于您实际上是在测试EmailSenderService
本身,因此请在spring.mail.host: localhost
属性(或注释)中设置application-test
。
这里完全不使用Spring DI。构造函数注入的主要优点是,您可以手动实例化bean,并且可以new
EmailSenderService
及其依赖项。
如果我了解您打算参加的考试范围,则#3可能是适合您的解决方案。