piTest已删除对“ forEach”生存的调用

问题描述 投票:2回答:1

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 

);
java spring java-8 testng pitest
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.