对使用getBean(“ myService”)的依赖项的类进行单元测试

时间:2019-04-12 13:24:13

标签: java spring junit

我使用的是杰克逊自定义序列化程序,该序列化程序不支持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 

1 个答案:

答案 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;
    }

}