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

标签 java spring junit

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

相关文章:

java - 如何将 HttpServletRequest 对象传递给测试用例?

java - 如何动态添加JButton到JPanel?

java - Android 联系人 - 检索 Android 联系人,如何将它们放入简单的 ListView 中?

java - Spark Streaming : Using PairRDD. saveAsNewHadoopDataset函数保存数据到HBase

java - Spring 集成: gateway bean not found

javascript - 可以是 String 或 Boolean 的 Spring 和 Json 字段映射

java - FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()) 返回 null

java - Kotlin 类文件无法在 IntelliJ for JUnit 中运行

java - .hgignore 'target' 文件夹有一些异常(exception)

java - 在需要 Maven 预集成测试执行的 Eclipse 中运行 JUnit 集成测试?