我对Java的经验非常少,而且我面临一些问题。
我有一个代码,看起来像下面的那个,目标是杀死它的所有突变
public class MyClass {
protected transient boolean something = false;
public MyClass () {
something = true;
}
boolean isSomething () {
return something;
}
}
我的测试代码看起来像这个
tester = MyClass();
assertTrue(tester.isSomething());
通过在Eclipse上使用pitest运行它,它将生成以下突变(所有突变都与return something
语句有关(:
- 用0替换1
- 删除了对成员变量something的赋值
- 将1替换为0
- 用-1代替1
- 用-1代替1
- 用2代替1
- 将1替换为0
不幸的是,我无法杀死这4个和5个突变,这两个突变都用-1代替了1。我有办法杀死他们吗?
这里有一些问题。
首先,你希望启用一些实验/研究突变算子,这些算子会产生垃圾突变。如果您坚持使用默认设置,则不会发生这种情况。
在jvm级别,布尔值表示为0/1的整数。只有以下突变才有意义
- 用0替换1
- 删除了对成员变量something的赋值
(注意,尽管在这种情况下突变是有意义的,但成员分配的删除在默认情况下是禁用的,因为它可以产生等效的突变体(
您没有提供完整的上下文,因此不清楚重复的1/0替换是重复的还是不同的。
要杀死这些突变体有两种方法。首先删除多余的代码。
public class MyClass {
protected transient boolean something = true;
boolean isSomething () {
return something;
}
}
这在功能上等同于原始代码,但数量较少
其次,你需要测试。
既然你已经保护了something
,我假设MyClass
有子类?如果没有,那么代码可以进一步减少到
public class MyClass {
boolean isSomething () {
return true;
}
}
你只能写一个测试。
assertThat(new MyClass().isSomething()).isTrue();
如果有子类,那么您需要测试来检查设置something
为true,然后断言isSomething
返回true,另一个设置为false并断言方法返回false。