【问题标题】:How to test Service class methods which uses Mapstruct mappers in Springboot?如何在 Spring Boot 中测试使用 Mapstruct 映射器的服务类方法?
【发布时间】:2020-10-24 14:32:08
【问题描述】:
@Mapper(uses = SomeMapper.class,imports = Date.class)
public interface DomainModelMapper {    
    Model domainToModel(Domain domain);
    
    @Mapping(target="dateUpdated", source="dateUpdated" ,defaultExpression = "java(Date.from(java.time.OffsetDateTime.now().toInstant()))")
    @Mapping(target="id.key",source="id.key",defaultExpression = "java(com.datastax.driver.core.utils.UUIDs.timeBased())")
    Domain modelToDomain(Model model);
}

我有一个映射器类来做一些日期转换

public class SomeMapper {

    public Date OffsetDateTimeToDate(OffsetDateTime offsetDateTime) {
        return offsetDateTime != null ? Date.from(offsetDateTime.toInstant()):null;
    }

    public OffsetDateTime DateToOffsetDateTime(Date date) {
        return date != null ? date.toInstant().atOffset(ZoneOffset.UTC) : null;
    }
}

这是我使用 DomainModelMapper 的服务类

@Service
public class SomeServiceImpl implements SomeService {
    
    @Autowired
    someRepository someRepository;
    
    
    private final DomainModelMapper domainToModelMapper = 
            Mappers.getMapper(DomainModelMapper.class);

    @Override
    public Model saveSomething(Model model) {
        return DomainModelMapper.domainToModel(someRepository
                .save(DomainModelMapper.modelToDomain(model)));
    }

如何对 saveSomething(Model model) 方法进行单元测试?如何注入 Mapstruct 类或模拟它们?

【问题讨论】:

    标签: java spring spring-boot mockito mapstruct


    【解决方案1】:

    如果您将@Mapper 接口作为基于Spring 的组件模型,那么它可以通过@Autowired 注解自动装配。阅读更多4.2. Using dependency injection

    @Mapper(uses = SomeMapper.class,imports = Date.class, componentModel = "spring")
    public interface DomainModelMapper { 
        // IMPLEMENTATION
    }
    
    @Service
    public class SomeServiceImpl implements SomeService {
        
        @Autowired
        SomeRepository someRepository;
        
        @Autowired
        DomainModelMapper domainModelMapper;
    
        // THE REST OF THE IMPLEMENTATION
    }
    

    测试变得相当容易,因为所有 bean 也可以通过 @Autowired 注释注入到 @SpringBootTest 中。

    • DomainModelMapper 可以自动装配并按原样用于单元测试,并依赖于其实现
    • SomeRepository 应使用 @MockBean 模拟,如果该类型不存在,则覆盖现有 bean 或创建一个新的...或者如果您使用内存数据库作为实现中的自动装配测试阶段,例如 H2。

    无论如何,测试类都准备好进行测试了。

    @SpringBootTest
    public class SomeServiceTest {
        
        @Autowired // or @MockBean
        SomeRepository someRepository;
        
        @Autowired // no need to mock it
        DomainModelMapper domainModelMapper;
    
        @Test
        public void test() {
            // TEST
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-15
      • 1970-01-01
      • 2021-01-04
      • 2017-11-03
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多