piTest удалил вызов forEach SURVIVED

TL;DR Я думаю, что мутация должна быть уничтожена, но она выжила. Я ищу причину, почему это происходит, и как исправить эти 2 вещи: (1) тайм-аут (2) мутация сохранилась.

Подробности У меня есть веб-приложение spring, и я тестирую его с помощью testng. Я извлек соответствующую часть кода. Пожалуйста, извините меня, если я создал какую-либо проблему при извлечении кода для этого вопроса. У меня есть проходящий тест, который проверяет, что callFunction вызывается 8 раз. Это проверено с помощью verify(a, atLeast(8)).called();. После просмотра отчета piTest кажется, что если callFunction удалить, функция все равно будет иметь a.called(); 8 раз ... что неожиданно.

Я проверил, удалив callFunction из исходного кода, и тестовый пример не прошел. См. раздел Изменено1 Rat.java.

Также я проверил, удалив forEach, и тестовый пример не прошел. См. Изменено2 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 

);

person zur    schedule 24.09.2017    source источник
comment
Это своего рода баг. Если я создаю проект с кодом из вопроса, он не воспроизводит проблему. Таким образом, piTest сообщает о проблеме из-за чего-то другого, возможно, многопоточности или, возможно, неправильной конфигурации. github.com/hcoles/pitest/issues/401   -  person zur    schedule 27.09.2017


Ответы (1)


Спустя годы, похоже, никто не упомянул, что (Spring) @Component и (Mockito) @InjectMocks являются взаимоисключающими решениями. У вас есть несколько сгенерированных подклассов Rat в игре, поэтому PIT просто не понимает, что происходит. Вероятно, он мутировал неправильно.

person drekbour    schedule 27.10.2019