gpt4 book ai didi

spring-boot - SpringBoot中的单元测试Freemarker模板 - 无法初始化freemarker配置

转载 作者:行者123 更新时间:2023-12-03 14:38:34 25 4
gpt4 key购买 nike

我们正在使用 Freemarker 为我们的应用程序将要发送的电子邮件生成 HTML 代码。

我们的使用和配置基于 https://github.com/hdineth/SpringBoot-freemaker-email-send
特别:

package com.example.techmagister.sendingemail.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ResourceLoader;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean;

import java.io.IOException;

@Configuration
public class FreemarkerConfig {

@Bean(name="emailConfigBean")
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration(ResourceLoader resourceLoader) {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
return bean;
}
}

但是,任何地方都绝对没有关于如何使用 JUnit 5 运行单元测试的信息或文档。

当我添加相关依赖项时
        <dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>

版本:
        <junit.jupiter.version>5.3.1</junit.jupiter.version>
<mockito.version>2.23.0</mockito.version>

并做了一个测试类:
package com.example.techmagister.sendingemail;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.io.IOException;


@ExtendWith({SpringExtension.class, MockitoExtension.class})
@Import(com.example.techmagister.sendingemail.config.FreemarkerConfig.class)
public class EmailTestTest {
private static final Logger LOGGER = LogManager.getLogger(EmailTestTest.class);

@Autowired
@Qualifier("emailConfigBean")
private Configuration emailConfig;

@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}

@Test
public void test() throws Exception {
try {
Template template = emailConfig.getTemplate("email.ftl");
} catch (IOException e) {
e.printStackTrace();
}
}

}

当我在 Debug模式下运行它时, emailConfig一片空白。
这是为什么?

他们的测试示例 https://github.com/hdineth/SpringBoot-freemaker-email-send/blob/master/src/test/java/com/example/techmagister/sendingemail/SendingemailApplicationTests.java
如果我添加相同的 Autowiring 属性,则可以工作,但它是一个完整的 SprintBoot 上下文,启动速度很慢,我只需要测试模板的使用情况,而无需实际发送电子邮件。

在我们的实际代码(大型多模块项目)中,我有另一个错误 org.springframework.beans.factory.UnsatisfiedDependencyException造成的:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'freemarker.template.Configuration' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=emailConfigBean)}

但这只是为了上下文,首先我想让它在简单的示例项目中工作,然后担心让它在我们的复杂项目中工作。

最佳答案

您无法自动连接您的 emailConfigBean直接作为 freemarker.template.ConfigurationFreeMarkerConfigurationFactoryBean是一个工厂 bean 。
获取 Confuguration你需要调用 factorybean.getObject()

所以而不是

    @Autowired
@Qualifier("emailConfigBean")
private Configuration emailConfig;

只需 Autowiring 您的 factorybean FreeMarkerConfigurationFactoryBean并使用 emailConfig.getObject().getTemplate("email.ftl") 加载您的模板


@Autowired
@Qualifier("emailConfigBean")
private FreeMarkerConfigurationFactoryBean emailConfig;

@Test
void testFreemarkerTemplate(){
Assertions.assertNotNull(emailConfig);
try {
Template template =
emailConfig
.getObject() // <-- get the configuration
.getTemplate("email.ftl"); // <-- load the template
Assertions.assertNotNull(template);
} catch (Exception e) {
e.printStackTrace();
}


github 进行工作测试

另一方面...
在 Spring Boot 应用程序中,可以使用 spring-boot-starter-freemarker 来简化 Freemarker 配置。依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>

这个使用 FreeMarker View 构建 MVC Web 应用程序的启动器添加了必要的自动配置。您需要做的就是将您的模板文件放在 resources/templates 中。文件夹。

然后你就可以自动连接 freemarkerConfig (或使用构造函数注入(inject)):

    @Autowired
private Configuration freemarkerConfig;

关于spring-boot - SpringBoot中的单元测试Freemarker模板 - 无法初始化freemarker配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com