TL; DR 我认为突变应该被杀死但是幸存下来。我正在寻找它发生的原因以及如何解决这两件事:(1)超时(2)突变幸存下来。
详细信息我有一个spring
网络应用程序,正在使用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
);
答案 0 :(得分:1)
几年后,但似乎没有人提到(Spring)@Component和(Mockito)@InjectMocks是互斥的解决方案。您正在运行多个生成的Rat子类,因此PIT只是对正在发生的事情感到困惑。它可能变异了错误的一个。