我使用的是杰克逊自定义序列化程序,该序列化程序不支持Spring依赖项注入,因此我的序列化程序类如下:
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
答案 0 :(得分:1)
您可以将JsonSerializer
与Spring自动连线。但是您必须使用SpringBeanAutowiringSupport。只需在构造函数中调用它,Spring即可自动关联依赖项。
public class ShippingAddressDataSerializer extends JsonSerializer<ShippingAddressData> {
@Autowired
private CalculatedSettingsService calculatedSettingsService;
public ShippingAddressDataSerializer() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
// ...
}
然后在测试中,您必须准备具有模拟依赖项的Spring上下文,以便可以对其进行存根。
当您无法使Spring受管Bean时,其他选择是不使用自动装配,并在构造函数中要求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;
}
}