gpt4 book ai didi

java - 对使用 getBean ("myService"的依赖项的类进行单元测试

转载 作者:行者123 更新时间:2023-12-02 10:00:48 25 4
gpt4 key购买 nike

我使用的是 Jackson 自定义序列化器,已知该序列化器不支持 Spring 依赖项注入(inject),因此我的序列化器类如下:

public class ShippingAddressDataSerializer extends JsonSerializer<ShippingAddressData> {

/** Jackson serializers don't support Spring dependency injection */
private CalculatedSettingsService calculatedSettingsService =
(CalculatedSettingsService) Registry.getApplicationContext().getBean("calculatedSettingsService");

@Override
public void serialize(ShippingAddressData addressData, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();

jsonGenerator.writeStringField("id", addressData.getId());

CalculatedSettings calculatedSettings = getCalculatedSettingsService()
.getSettingsForCurrentUser(SettingType.REQUIRE_COUNTY);

if (calculatedSettings.getIsCountyRequired()) {
jsonGenerator.writeStringField("county", addressData.getCounty());

}

jsonGenerator.writeEndObject();
}

public CalculatedSettingsService getCalculatedSettingsService() {
return calculatedSettingsService;
}

public void setCalculatedSettingsService(CalculatedSettingsService calculatedSettingsService) {
this.calculatedSettingsService = calculatedSettingsService;
}
}

我在对此类进行单元测试时遇到问题,因为我不知道如何提供 calculatedSettingsService 的模拟版本。

单元测试不断尝试启动我的应用程序上下文,但出现以下错误:

java.lang.IllegalStateException: Can not activate tenant <<master>> since it has no application context created 

最佳答案

您可以使用 Spring Autowiring JsonSerializer。但你必须使用SpringBeanAutowiringSupport 。只需在构造函数中调用它,Spring 就会 Autowiring 依赖项。

public class ShippingAddressDataSerializer extends JsonSerializer<ShippingAddressData> {

@Autowired
private CalculatedSettingsService calculatedSettingsService;

public ShippingAddressDataSerializer() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

// ...

}

然后在测试中,您必须使用模拟依赖项准备 Spring 上下文,以便可以对其进行 stub 。

当您无法使其成为 Spring 托管 Bean 时,其他选择是不使用 Autowiring 并在构造函数中请求 CalculatedSettingsService 。无论如何,你必须注册你的自定义序列化器,这可能是在某些 Spring 配置文件中完成的。您可以在那里手动进行接线。使用这样的构造函数,测试将变得微不足道。

这是此类配置的草稿。

@Configuration
public class JacksonConfiguration {

@Bean
public ObjectMapper objectMapper(final CalculatedSettingsService calculatedSettingsService) {
final ObjectMapper mapper = new ObjectMapper();

final SimpleModule module = new SimpleModule();
module.addSerializer(ShippingAddressData.class, new ShippingAddressDataSerializer(calculatedSettingsService));
mapper.registerModule(module);

return mapper;
}

}

关于java - 对使用 getBean ("myService"的依赖项的类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55652649/

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