2

TL; DR我认为突变应该被杀死,但它幸存了下来。我正在寻找它发生的原因以及如何解决这两个问题:(1)超时(2)突变幸存下来。

详细信息我有一个springWeb 应用程序并正在使用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.javapiTest

类型.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 

);
4

1 回答 1

2

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

于 2019-10-27T21:47:12.157 回答