gpt4 book ai didi

java - Spring Boot 测试和 Jackson - 在测试中从上下文设置 (application.yml) 获取 ObjectMapper 的实例,无需开销配置

转载 作者:行者123 更新时间:2023-12-02 00:04:17 27 4
gpt4 key购买 nike

我想知道从 application.yml 中的上下文设置获取 ObjectMapper 实例的最佳方法是什么,而无需“开销”配置(这意味着,WebAppConfigurationContextConfiguration)在 Spring Boot 中,仅在测试中加载最少数量的类。

我已经知道,要在 application.yml(spring.jackson.xxx) 中加载 Jackson 相关的配置,您必须 @Autowired Jackson2ObjectMapperBuilder,并使用 builder.build() 获取 ObjectMapper

所以我创建一个配置类:

@Configuration
public class JacksonConfig {
@Autowired
private Jackson2ObjectMapperBuilder objectMapperBuilder;

@Bean
public ObjectMapper objectMapper() {
return objectMapperBuilder.build();
}
}

还有一个包装类:

@Service
@Slf4j
public class JsonConverter {

@Getter
@Autowired
private ObjectMapper mapper;

public String objectToJson(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.error("Cannot serialize object {} to JSON", obj);
throw new ServiceException(ErrorCode.JSON_CONVERTER_EXCEPTION)
.addLog("log", e.getMessage());
}
}

public Object jsonToObject(Class c, String json) {
try {
return mapper.readValue(json, c);
} catch (IOException e) {
log.error("Cannot deserialize JSON as instance of class {}", c.getName());
throw ServiceException.wrap(e, ErrorCode.JSON_CONVERTER_EXCEPTION)
.addLog("json", json)
.addLog("target class", c.getName());
}
}

public String messageErrorToJson(String message) {
Map result = Collections.singletonMap("responseError", message);
return objectToJson(result);
}
}

这适用于 gradle bootRun 以及这样的测试:

@Slf4j
@SpringBootTest // we can only launch the whole context to make Jackson2ObjectMapperBuilder to work
@WebAppConfiguration
@ContextConfiguration
class JsonConverterTest {

@Autowired
private JsonConverter jsonConverter;

...

我知道它有效,因为在调试时它会停止 JacksonAutoConfiguration 类中的断点。

但是,我想知道是否有另一种更简单的方法来获取它。为什么我必须使用 @WebAppConfiguration@ContextConfiguration?为什么 @SpringBootTest 不加载 application.yml spring.jackson.xx 值?

或者,为了确保加载 application.yml ,如何限制在 SpringBootTest 中加载的类,以最大限度地减少要加载的类数量和速度测试通过了吗?

编辑:如果我删除 @WebAppConfigurationContextConfiguration,并添加 @SpringBootTest(class = MyApplication.class),它还会加载所有上下文/启动整个应用程序和工作。

最佳答案

让我们从你的最后一点开始

If I delete @WebAppConfiguration and ContextConfiguration, and add @SpringBootTest(class = MyApplication.class), it also loads all the context/launch the whole app and works.

请检查此link ,对于 springboot 1.4 及更高版本,可以使用 @SpringbootTest 代替 @ContextConfiguration (以及其他一些测试注释)

仅当您希望初始化应用程序的 Web 部分时,才应使用

@WebAppConfiguration。例如,如果您想使用 MockMvc 等测试您的 Controller 。

不知道为什么你问 springboot 测试是否加载 application.yml,你是否尝试在测试期间从那里加载任何属性(我在这里没有看到)。

关于java - Spring Boot 测试和 Jackson - 在测试中从上下文设置 (application.yml) 获取 ObjectMapper 的实例,无需开销配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58164420/

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