【问题标题】:Unit test is failing while converting an entity to Immutable model object using Mapstruct使用 Mapstruct 将实体转换为不可变模型对象时单元测试失败
【发布时间】:2020-06-07 16:59:18
【问题描述】:

我正在使用 MapStruct 将数据库实体转换为不可变模型对象。所以不可变对象没有设置器,但 Mapstruct 在映射对象时需要设置器。所以我使用不可变对象构建器创建了一个显式构建器来提供给 Mapstruct。以下是代码中的sn-ps:

@Value.Immutable
@Value.Style(overshadowImplementation = true)
public interface CarModel {
    @Nullable String getCarId();
}
@Mapper(uses = ImmutablesBuilderFactory.class)
public interface CarMapper {
    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

    @Mapping(source = "id", target = "carId")
    ImmutableCarModel.Builder toModel(CarEntity carEntity);
}
public class ImmutablesBuilderFactory {
    public ImmutableCarModel.Builder createCarModelBuilder() {
        return ImmutableCarModel.builder();
    }
}

以下代码由 Mapstruct 生成:

public class CarMapperImpl implements CarMapper {
    @Autowired
    private final ImmutablesBuilderFactory immutablesBuilderFactory
    @Override
    public Builder toModel(CarEntity carEntity) {
        if ( carEntity == null ) {
            return null;
        }
        Builder builder = immutablesBuilderFactory.createCarModelBuilder();
        if ( carEntity.getId() != null ) {
            builder.carId( carEntity.getId() );
        }
        return builder;
    }
}

我能够将实体转换为不可变模型对象,但单元测试为此失败。在单元测试中调用 CarMapper.INSTANCE.toModel(carEntity).build(); 时,它会在 CarMapperImpl 类的代码下方抛出 NPE

Builder builder = immutablesBuilderFactory.createCarModelBuilder();

有人知道这里出了什么问题吗?

【问题讨论】:

  • 对可以返回 null 的东西调用任何方法都是有风险的。 toModel 的代码显然可以返回 null,但是你直接调用 .build() 而不检查 null
  • 是的,我明白这一点。但是 NPE 被抛出,因为 immutablesBuilderFactory 为空。
  • immutablesBuilderFactory 不可能是 null。该字段是最终的,并且在类中创建了一个新实例。你确定CarMapperImpl 看起来像问题吗?
  • 是的,你是对的。 ImmutablesBuilderFactory 正在自动装配。修改了问题。

标签: java mapstruct immutables-library


【解决方案1】:

NPE 的原因是因为您混合使用默认和弹簧组件模型。

Mappers#getMapper 仅适用于默认组件模型。使用依赖注入框架时,您需要使用该框架来访问映射器。

【讨论】:

    【解决方案2】:

    这是由于 MapStruct 配置中的以下属性

    -Amapstruct.defaultComponentModel=spring
    

    删除后,Mapstruct 不再自动装配,并且能够创建 ImmutablesBuilderFactory 的实例。

    【讨论】:

    • 问题不在于这个,而在于库的错误使用。看看我的回答
    猜你喜欢
    • 2023-04-09
    • 2014-10-27
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2020-08-21
    • 2016-01-21
    相关资源
    最近更新 更多