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

标签 java mapstruct immutables-library

我正在使用 MapStruct 将数据库实体转换为不可变模型对象。所以 Immutable 对象没有 setter,但 Mapstruct 在映射对象时需要 setter。因此,我使用不可变对象(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;
    }
}

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

Builder builder = immutablesBuilderFactory.createCarModelBuilder();

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

最佳答案

出现 NPE 的原因是因为您混合使用了默认组件模型和 spring 组件模型。

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

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

相关文章:

java - 仅映射来自 DTO 的特定字段 -> 使用 Map-Struct 的模型

mapstruct - 将 List 转换为具有多个参数的另一个 List

java - 这是在构建器对象中创建空集的最佳方法

由于无限初始化导致 Java StackOverflow

java - 为什么我应该显式转换 null 来调用 varargs 方法?

java - 无法将 MapStruct 映射器注入(inject) spring-boot JUnit 测试

java - 我应该在 Immutables 的单元测试中使用真实对象还是模拟对象?

java - 注释从 Immutables 接口(interface)奇怪地传递到实现

java - JTree ConvertValueToText 返回在更改时被截断

java - 有可能减少这个吗? (或 Java 中的解构赋值)