我正在使用MapStruct将数据库实体转换为不可变模型对象。因此,不可变对象没有设置器,但是Mapstruct在映射对象时需要设置器。因此,我使用不可变对象构建器创建了一个显式构建器,以提供给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;
    }
}


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

Builder builder = immutablesBuilderFactory.createCarModelBuilder();


有谁知道这是怎么回事?

最佳答案

这是由于MapStruct配置中的below属性

-Amapstruct.defaultComponentModel=spring


删除此选项后,Mapstruct无法自动装配,并且能够创建ImmutablesBuilderFactory的实例。

关于java - 使用Mapstruct将实体转换为不可变模型对象时,单元测试失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62205016/

10-12 05:44