我有一个带有JUnit 5测试的Java 11小示例,得出的结果很糟糕:
条件边界已更改→已生存
主类:
public final class CheckerUtils
{
private CheckerUtils()
{
super();
}
public static int checkPort(final int port)
{
if (port < 0)
{
throw new IndexOutOfBoundsException("Port number out of range!");
}
return port;
}
}
测试类:
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
import de.powerstat.security.CheckerUtils;
public final class CheckerUtilsTests
{
@Test
public void checkPortOk()
{
final int port = 1023;
final int resultPort = CheckerUtils.checkPort(port);
assertEquals(port, resultPort, "Port not as expected!");
}
@Test
public void checkPortNegative1()
{
final int port = -1;
assertThrows(IndexOutOfBoundsException.class, () ->
{
CheckerUtils.checkPort(port);
}
);
}
@Test
public void checkPortNegative2()
{
final int port = -1;
int resultPort = 0;
try
{
resultPort = CheckerUtils.checkPort(port);
}
catch (final IndexOutOfBoundsException e)
{
// ignore
}
assertEquals(0, resultPort, "Port is not 0");
}
}
从我的角度来看,该突变不能存活,因为:
所以我的问题是我是否在这里错过了一些东西,或者是pitest(1.4.9)中的错误?
解决方案
作为@henry的陈述,添加以下测试解决了该问题:
@Test
public void checkPortOk2()
{
final int port = 0;
final int resultPort = CheckerUtils.checkPort(port);
assertEquals(port, resultPort, "Port not as expected!");
}
答案 0 :(得分:2)
条件边界突变将发生突变
if (port < 0)
收件人
if (port <= 0)
由于所有测试均未提供输入0,因此无法将突变体与未突变程序区分开,突变体将继续存在。
添加一个描述端口为0时预期行为的测试用例将杀死该突变体。