mapstruct

问题描述

我在我的项目中使用了 mapstruct,最近使用 pitest 添加了一些“突变分析”。

我遇到的问题是在某些生成代码上创建了一个突变体,我无法修复我的测试以杀死它,因为这与 mapstruct 生成的 null 检查有关,无法访问。

即,如果我有以下映射器:

@Mapper
public abstract class MyMapper {
  
  @Mapping(source= "someInnerObject.field",target="someField")
  public abstract Bar toBar(Foo foo);

}

Mapstruck 将生成如下内容

public class MyMapperImpl extends MyMapper {
  @Override
  public Bar toBar(Foo foo) {
    if(foo == null) {
      return null; // reacheable code,all is fine here.
    }

    Bar bar = new Bar();
    bar.setSomeField(fooSomeField(foo))
    
    return bar;
  }

  private String fooSomeField(Foo foo) {
    if (foo == null) {
      return null;   // Unreacheable code,already tested in public method.
    }
    
    SomeInnerObject innerObject = foo.getSomeInnerObject()
    if(innerObject == null) {
      return null;  // reacheable code,no problem here
    }
    
    String field = o.getField();
    if(field == null) {
      return null; // reacheable,no problem here.
    }
    return field;

  }

}

正如我们所见,mapstruct 会生成一个无法访问的空检查,从而无法在测试中覆盖这些行。突变分析器尝试在无法到达的行上返回 "" 而不是 null,因此,我的测试从未检测到突变体。这导致无法获得 100% 的代码覆盖率和 100% 的变异覆盖率。

我不认为从覆盖率或变异分析中排除这个生成代码一个不错的选择,因为生成代码反映了在映射器中被编码为注释的行为:所以我们想确保这些行为是在测试中正确覆盖。

这里有人有同样的问题吗,或者有什么建议吗?
我尝试了许多不同的映射器配置来摆脱无法访问的行,但没有成功(除非我只是禁用所有空检查,这会改变我的应用程序逻辑)。

解决方法

MapStruct 生成代码的方式不允许我们跳过私有方法中的空检查。

您可以尝试在 MapStruct 项目中提出问题。但是,我不确定是否值得花时间跳过此空检查。在任何情况下,JIT 都会在运行时移除该检查。

关于 100% 代码覆盖率和 100% 突变覆盖率的话题是一个将导致结束这个问题的讨论话题。