私は、JUnit 5 テストを含む小さな Java 11 の例を持っています。
条件境界の変更 → SURVIVED
メインクラス:
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");
}
}
私の観点からすると、次の理由により、突然変異は生き残るべきではありません。
- checkPortOk() は、負でない有効な値の通常のパスです
- checkPortNegative1() は、noting が変更され、例外がスローされた場合の負の値のパスです。
- checkPortNegative2(): 何も変更されていない場合、例外がスローされ、resultPort はまだ 0 であるため、ここでのアサーションは問題ありません
- checkPortNegative2(): < 0 が < -1 またはそれ以下に変更された場合、例外はスローされないため、resultPort は -1 になり、アサートは失敗します (突然変異が強制終了されます)。
- checkPortNegative2(): < 0 が < 1 以上に変更された場合、3 以下と同じ。
だから私の質問は、ここで何かを見逃したのですか、それともピテスト(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!");
}