TL; DR我认为突变应该被杀死,但它幸存了下来。我正在寻找它发生的原因以及如何解决这两个问题:(1)超时(2)突变幸存下来。
详细信息我有一个spring
Web 应用程序并正在使用testng
. 我已经提取了代码的相关部分。如果我在提取此问题的代码时引入了任何问题,请原谅。我有一个通过测试用例,它验证 callFunction 被调用了 8 次。这已使用verify(a, atLeast(8)).called();
在查看 piTest 报告后进行验证,似乎如果callFunction
删除了该功能,该功能仍将有a.called();
8 次......这是出乎意料的。
我已经通过callFunction
从源中删除进行了检查,并且测试用例确实失败了。请参阅已修改1 Rat.java
部分。
此外,我通过删除 进行了检查,forEach
并且测试用例确实失败了。见修改2 Rat.java
。
还有一个更有趣的事情是,当我只更改文本的(格式)位置时,如Modified3部分Rat.java
所示,报告发生了变化。 Rat.java
piTest
类型.java
package lab.rat;
public class Type {
}
动作.java
package lab.rat;
import org.springframework.stereotype.Component;
@Component public class Action {
public void called() {}
}
大鼠.java
package lab.rat;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component public class Rat {
@Autowired private Action a;
public void testee() {
Map<Type, Integer> properties = new HashMap<>();
IntStream
.range(0, 8)
.forEach(index -> properties.put(new Type(), index));
properties
.entrySet()
.stream()
通知下一行
.forEach(entry -> callFunction()); // removed call to lab/rat/Rat::callFunction ? TIMED_OUT
// removed call to java/util/stream/Stream::forEach ? SURVIVED
}
private void callFunction() {
a.called();
}
}
RatTest.java
package lab.rat;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import lab.rat.config.SpringConfigurationForTest;
public class RatTest extends SpringConfigurationForTest {
@InjectMocks Rat rat;
@Mock Action a;
@BeforeMethod public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test public void testTestee() {
rat.testee();
verify(a, atLeast(8)).called();
}
}
Modified1 Rat.java -- 测试失败
.stream()
.forEach(entry -> {});
Modified2 Rat.java -- 测试失败
.stream();
Modified3 Rat.java——又创建了一个突变
.stream()
.forEach( // removed call to java/util/stream/Stream::forEach ? SURVIVED
// removed call to lab/rat/Rat::callFunction ? TIMED_OUT
entry -> callFunction() // replaced return of integer sized value with (x == 0 ? 1 : 0) ? KILLED
);