Java 无效问题:布尔值将整数值的返回替换为(x==0?1:0)→;幸存下来的
更新: 自从这个问题发布后,突变覆盖失败就消失了,可能是因为pit中的错误修复 所以这个问题现在是无效的。我不知道在这种情况下该怎么办。删除问题?把它留在这里 我正在使用pit进行突变测试。在一个非常简单的函数中有一个僵尸:Java 无效问题:布尔值将整数值的返回替换为(x==0?1:0)→;幸存下来的,java,identity,mutation-testing,Java,Identity,Mutation Testing,更新: 自从这个问题发布后,突变覆盖失败就消失了,可能是因为pit中的错误修复 所以这个问题现在是无效的。我不知道在这种情况下该怎么办。删除问题?把它留在这里 我正在使用pit进行突变测试。在一个非常简单的函数中有一个僵尸: public boolean isAuthenticated() { return true; } 它通过以下方式进行测试: assertEquals(true, isAuthenticated()); 但是我得到的错误将整数值的返回替换为(x==0?1:0)
public boolean isAuthenticated() {
return true;
}
它通过以下方式进行测试:
assertEquals(true, isAuthenticated());
但是我得到的错误将整数值的返回替换为(x==0?1:0)→ 幸存
我确实尝试使用System.identityHashCode()检查标识,但没有帮助
有没有办法杀死这个僵尸?
如果没有,我如何才能关闭布尔值或这行代码的特定检查?我认为错误没有揭示问题的根源,在我的情况下(很可能在任何情况下)不可能这样做 在我的例子中,我有一个对象列表,其中包含一个返回谓词的函数。因此,我使用stream对所有对象进行迭代,并过滤其中一个匹配谓词和另一个对象作为候选对象的对象。因此,就代码而言,我有:
public List<ParkingSlot> getFreeParkingSlots(List<DepartmentParkingRule> ruleList, Employee candidate){
return
ruleList.stream().
.filter(j -> j.getPredicate().test(candidate)) // <-- here appeared the error *replaced return of integer sized value with (x == 0 ? 1 : 0) → SURVIVED*
.map(t -> t.getFreeParkingSlots(candidate))
.findFirst()
.orElseThrow(new NotMatchedException(candidate));
}
因此,错误将整数值的返回替换为(x==0?1:0)→ 存活
表明发生了突变,最重要的是,这种突变没有导致我的测试失败
下次看到这个错误时,我将从整体上考虑对测试的影响,而不是具体的布尔函数
需要注意的是,上面的代码不是真实的,但对于说明如何解释错误和修改源代码的操作非常有用。改变测试可能有助于杀死该突变株,但这取决于每个病例
希望它能帮助别人。对返回值的简单检查应该可以杀死这个变种,如果没有,那么您的项目中会发生其他事情。你能提供更多的细节吗?完整的测试,你正在使用的测试框架等等。同一类中的其他变种是否被杀死?你确定该方法中存在变异吗?我敢肯定,用整数resulties替换布尔值是没有意义的。是的,这是没有意义的。据我所知,你的案例是关于一种情况,一个意外的依赖行为被PIT“嘲笑为坏”。在生产代码没有依赖性的情况下,如何将其应用到我的案例中?我的代码几乎完全是复制的(调用生产方法时只缺少类引用)。@rpád Magosányi:不,这不是关于模拟依赖。它是关于如何解释错误以及解决错误所需的操作。在Github上提供您的错误的工作展示,我将帮助您解决它。测试:它不会使构建失败,因为该类有一个@InterfaceClass注释,但您可以在pit报告中找到它。@ÁrpádMagosányi在我删除需要java 7 tools.jar的xml doclet依赖项后,我无法复制它。它给了我100%的变异覆盖率。请在此处查看更改:。您可能会遇到配置/依赖性问题。
public List<ParkingSlot> getFreeParkingSlots(List<DepartmentParkingRule> ruleList,
Employee candidate){
Optional<List<ParkingSlot>> parkingSlots = ruleList.stream().
.filter(j -> j.getPredicate().test(candidate))
.map(t -> t.getFreeParkingSlots(candidate))
.reduce((anElement, otherElement) ->
throw new DuplicateException());//reduce is executed when a possible false positive duplicate rule match
if (parkingSlots.isPresent() && CollectionUtils.isNotEmpty(parkingSlots.get())){
return parkingSlots.get();
}else {
throw new NotMatchedException(candidate);
}
}