使用Mapstruct将实体转换为不可变模型对象时,单元测试失败。

问题描述 投票:0回答:1

我正在使用MapStruct将数据库实体转换为Immutable模型对象。所以Immutable对象没有setters,但是Mapstruct在映射对象时需要setters,所以我使用Immutable对象构建器创建了显式构建器提供给Mapstruct。所以我使用Immutable对象构建器创建了一个显式构建器提供给Mapstruct。下面是代码的片段。

@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;
    }
}

我能够将一个实体转换为Immutable模型对象,但是单元测试失败了。当调用CarMapperImpl类中的以下一行代码时,它正在抛出NPE。CarMapper.INSTANCE.toModel(carEntity).build(); 在单元测试中

Builder builder = immutablesBuilderFactory.createCarModelBuilder();

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

java mapstruct immutables-library
1个回答
0
投票

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

-Amapstruct.defaultComponentModel=spring

去掉这个之后,Mapstruct没有自动布线,能够创建一个ImmutablesBuilderFactory的实例。


0
投票

出现NPE的原因是由于你将默认组件模型和spring组件模型混合使用。

Mappers#getMapper 仅用于默认的组件模型。当使用依赖注入框架时,你需要使用该框架来获得对映射器的访问。

© www.soinside.com 2019 - 2024. All rights reserved.