piTest删除了对“forEach”生存的电话

时间:2017-09-24 04:29:10

标签: java spring java-8 testng pitest

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 

);

1 个答案:

答案 0 :(得分:1)

几年后,但似乎没有人提到(Spring)@Component和(Mockito)@InjectMocks是互斥的解决方案。您正在运行多个生成的Rat子类,因此PIT只是对正在发生的事情感到困惑。它可能变异了错误的一个。