TL; DR我认为应该杀死突变,但突变可以幸免。我正在寻找它发生的原因以及如何解决这2件事:(1)超时(2)突变幸免。
Details我有一个spring
Web应用程序,正在使用testng
进行测试。我已经提取了代码的相关部分。如果我在提取此问题的代码时引入了任何问题,请原谅。我有一个通过测试用例,它验证callFunction被调用了8次。使用verify(a, atLeast(8)).called();
对此进行了验证。在看到piTest报告后,似乎callFunction
被删除了,该功能仍将具有a.called();
8次……这是意外的。
我已经从源代码中删除了callFunction
,并且测试用例确实失败了。请参见Modified1 Rat.java
部分。
而且我已经通过删除forEach
进行了检查,并且测试用例确实失败了。参见Modified2 Rat.java
。
[还有一件有趣的事情,当我仅更改Rat.java
中文本的(格式)位置时,如Modified3 Rat.java
部分中所示,piTest
报告也更改了。
Type.java
package lab.rat;
public class Type {
}
Action.java
package lab.rat;
import org.springframework.stereotype.Component;
@Component public class Action {
public void called() {}
}
Rat.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
);
几年后,似乎没有人提到(Spring)@Component和(Mockito)@InjectMocks是互斥的解决方案。您正在运行多个生成的Rat子类,因此PIT只是对正在发生的事情感到困惑。它可能变异了错误的一个。