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
);