美文网首页
日常总结:mock单测+mapStruct+批量插入

日常总结:mock单测+mapStruct+批量插入

作者: 灿烂的GL | 来源:发表于2021-06-01 15:14 被阅读0次

一、单测
test采用juint5
pom如下:

<!-- lombok -->
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.9.0</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.7.1</version>
    <scope>test</scope>
</dependency>

常见使用
1、mock mapper文件

  @Resource
    private GoodsService goodsService;

    @MockBean
    private GoodsMapper goodsMapper;

   @Test
    void deleteGoodsServiceBySku() throws Exception {
        GoodsDO goodsDO = new GoodsDO();
        goodsDO.setId(1L);
         Mockito.when(goodsMapper.selectByPrimaryKey(Mockito.anyLong())).thenReturn(goodsDO);
    
        goodsService.deleteServiceBySku(1L);

    }

2、公共返回值定义

    @BeforeEach
    void set() {
        goodsDO = new GoodsDO();
        goodsDO.setId(1L);
    }

3、异常断言

   try {
            goodsService.updateService(Dos);

        } catch (Exception e) {
            assertThat(e).isInstanceOf(GoodsException.class).hasMessage(ExceptionEnum.CONFLICT.getDesc());
        }

4、不同情况

        try {
            AssetService.search(assetSearchDTO);
        } catch (Exception e) {
            log.info("e", e.getMessage());
        }
        assetSearchDTO.setSearchType(2);
        try {
            AssetService.search(assetSearchDTO);
        } catch (Exception e) {
            log.info("e", e.getMessage());
        }

        assetSearchDTO.setSearchType(3);
        try {
            AssetService.search(assetSearchDTO);
        } catch (Exception e) {
            log.info("e", e.getMessage());
        }
        assetSearchDTO.setSearchType(4);
        try {
            AssetService.search(assetSearchDTO);
        } catch (Exception e) {
            log.info("e", e.getMessage());
        }

二、mapStruct
1、DTO中返回枚举类型
问题:直接将枚举类反馈给前端,具体取对应数值还是文字上一层在做处理(这里do到dto的转换用的是mapStruct)
返回的数据类型如下:

@Data
public class OrderDTO implements Serializable {

    private static final long serialVersionUID = -1625092515960632463L;

    private OrderEnum source;

    private Integer num;
}

解决:枚举类中添加自定义方法,mapStruct中通过映射做转换
mapStruct依赖

     <!-- MapStruct -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
            <optional>true</optional>
        </dependency>

@Getter
@AllArgsConstructor
public enum  OrderEnum {

    SO(1, "SO");

    /**
     * 类型code
     */
    private Integer type;

    /**
     * 描述
     */
    private String desc;
    private static final Map<Integer, OrderSourceEnum> ENUM_MAP;
//枚举中初始化一个map,key为值,value为enum
    static {
        OrderEnum[] values = values();
        Map<Integer, OrderEnum> enToCn = new HashMap<>(values.length);
        for (OrderEnum value : values) {
            enToCn.put(value.getType(), value);
        }

        ENUM_MAP = Collections.unmodifiableMap(enToCn);
    }

    /**
     * 根据类型查找枚举
     */
    public static OrderSourceEnum searchEnumByType(Integer type){
    return ENUM_MAP.get(type);
    }
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface OrderMapStruct {
//需要转换枚举类的字段,建议在do的转换上写不是list的转化上写
    @Mapping(target = "source", expression = "java(com.enums.Enum.searchEnumByType(orderDO.getSource()))")
   OrderDTO orderDo2dto(OrderDO orderDO);

2、返回的两个实体类中参数名不一致

   @Mappings({
            @Mapping(target = "uname", source = "sname")
          // 多个属性不对应可以用 "," 隔开编写多个@Mapping
          // ,@Mapping(target = "uname", source = "sname")
    })
 OrderDTO orderDo2dto(OrderDO orderDO);

三、批量插入
mybatis批量插入(传入数据不能有空值)

  <insert id="insertOrderStatisticDayList">
    insert into order_day
    (order_num, count_date)
    values
    <foreach collection="list" item="item" separator=",">
      (#{item.orderNum,jdbcType=BIGINT}, #{item.countDate,jdbcType=DATE})
    </foreach>
  </insert>

四、hutool工具
参考:常见方法


参考链接:
1、事务
2、mapStruct其他转换

相关文章

网友评论

      本文标题:日常总结:mock单测+mapStruct+批量插入

      本文链接:https://www.haomeiwen.com/subject/hywvsltx.html