问题描述
我在我的项目中使用了 mapstruct,最近使用 pitest 添加了一些“突变分析”。
我遇到的问题是在某些生成的代码上创建了一个突变体,我无法修复我的测试以杀死它,因为这与 mapstruct 生成的 null 检查有关,无法访问。
即,如果我有以下映射器:
@Mapper
public abstract class MyMapper {
@Mapping(source= "someInnerObject.field",target="someField")
public abstract Bar toBar(Foo foo);
}
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% 突变覆盖率的话题是一个将导致结束这个问题的讨论话题。