我使用的是 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/