8

私は、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");
   }

 }

私の観点からすると、次の理由により、突然変異は生き残るべきではありません。

  1. checkPortOk() は、負でない有効な値の通常のパスです
  2. checkPortNegative1() は、noting が変更され、例外がスローされた場合の負の値のパスです。
  3. checkPortNegative2(): 何も変更されていない場合、例外がスローされ、resultPort はまだ 0 であるため、ここでのアサーションは問題ありません
  4. checkPortNegative2(): < 0 が < -1 またはそれ以下に変更された場合、例外はスローされないため、resultPort は -1 になり、アサートは失敗します (突然変異が強制終了されます)。
  5. 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!");
 }
4

1 に答える 1