Java JUnit5测试

Java JUnit5测试,java,eclipse,junit,junit4,junit5,Java,Eclipse,Junit,Junit4,Junit5,如何通过使用java和@test注释的junit测试用例实现此类中3个方法的完整分支覆盖 public class StringStack { private int capacity = 10; private int pointer = 0; private String[] objects = new String[capacity]; public void push(String o) { if (pointer >= capacity) throw n

如何通过使用java和@test注释的junit测试用例实现此类中3个方法的完整分支覆盖

public class StringStack {
private int capacity = 10;
private int pointer = 0;
private String[] objects = new String[capacity];

public void push(String o) {
    if (pointer >= capacity)
        throw new IllegalArgumentException("Stack exceeded capacity!");
    objects[pointer++] = o;

}
public String pop() {
    if (pointer <= 0)
        throw new IllegalArgumentException("Stack empty");
    return objects[--pointer];

}

public boolean isEmpty() {
    return pointer <= 0;

}

我将为第一个函数提供一个示例

public void push(String o) {
    if (pointer >= capacity)
        throw new IllegalArgumentException("Stack exceeded capacity!");
    objects[pointer++] = o;
}
您需要3个统一测试才能完全覆盖此测试

  • 对于指针==容量
  • 一个用于指针>容量
  • 最后一个是指针<容量

  • 对于分支覆盖率,您只需要1和3或2和3,尽管我建议所有这三个都用于关键的功能

    我将为第一个函数提供一个示例

    public void push(String o) {
        if (pointer >= capacity)
            throw new IllegalArgumentException("Stack exceeded capacity!");
        objects[pointer++] = o;
    }
    
    您需要3个统一测试才能完全覆盖此测试

  • 对于指针==容量
  • 一个用于指针>容量
  • 最后一个是指针<容量

  • 对于分支覆盖率,您只需要1和3或2和3,尽管我建议所有这三个都用于关键的功能

    可能低于测试,但有助于获得全面覆盖

    推法试验

    • 指针>=容量

      @Test(exception = IllegalArgumentException.class)
      public void push_PointerGreaterThanCapacity_ExceptionThrow(){
          WhiteBox.setInternalState(yourObject, "pointer",11);
          String inputString  = "Hello";
          yourObject.push(inputString);
      }
      
    • 指针<容量

      @Test
      public void push_PointerSmallerThanCapacity_ExceptionThrow(){
          String inputString  = "Hello";
          yourObject.push(inputString);
          int pointer = WhiteBox.getInternalState(yourObject,"pointer");
          String[] objects = WhiteBox.getInternalState(yourObject,"objects");
      
          assertEquals(inputString, objects[pointer-1]);
      }
      
    pop法试验

    • 指针<0

      @Test(exception = IllegalArgumentException.class)
      public void pop_PointerNegative_ExceptionThrow(){
          WhiteBox.setInternalState(yourObject, "pointer",-1);
          String inputString  = "Hello";
          yourObject.push(inputString);
      }
      
    • 指针>0

      @Test
      public void pop_pointerGreaterThenZero_PopValue(){
          //set pointer
          WhiteBox.setInternalState(yourObject, "pointer",2);
          String[] stringList = {"String0","String1","String2"};
          //object array
          WhiteBox.setInternalState(yourObject, "objects",stringList);
      
          String actualOutput = yourObject.pop();
          assertEquals(actualOutput, stringList[1]);
      }
      

    在这里,您的对象是您测试的类的对象。

    可能低于测试,同时有助于获得全面覆盖

    推法试验

    • 指针>=容量

      @Test(exception = IllegalArgumentException.class)
      public void push_PointerGreaterThanCapacity_ExceptionThrow(){
          WhiteBox.setInternalState(yourObject, "pointer",11);
          String inputString  = "Hello";
          yourObject.push(inputString);
      }
      
    • 指针<容量

      @Test
      public void push_PointerSmallerThanCapacity_ExceptionThrow(){
          String inputString  = "Hello";
          yourObject.push(inputString);
          int pointer = WhiteBox.getInternalState(yourObject,"pointer");
          String[] objects = WhiteBox.getInternalState(yourObject,"objects");
      
          assertEquals(inputString, objects[pointer-1]);
      }
      
    pop法试验

    • 指针<0

      @Test(exception = IllegalArgumentException.class)
      public void pop_PointerNegative_ExceptionThrow(){
          WhiteBox.setInternalState(yourObject, "pointer",-1);
          String inputString  = "Hello";
          yourObject.push(inputString);
      }
      
    • 指针>0

      @Test
      public void pop_pointerGreaterThenZero_PopValue(){
          //set pointer
          WhiteBox.setInternalState(yourObject, "pointer",2);
          String[] stringList = {"String0","String1","String2"};
          //object array
          WhiteBox.setInternalState(yourObject, "objects",stringList);
      
          String actualOutput = yourObject.pop();
          assertEquals(actualOutput, stringList[1]);
      }
      

    这里,yourObject是您测试的类的对象。

    通过编写测试。但是为什么你想达到100%的分支覆盖率呢?不要在评论中发表你的意见。编辑我们的问题。如果您正在使用,为什么这个问题有标签?请显示您的测试。又一个问题:为什么要实现100%的分支机构覆盖率?我建议编写有价值的测试,例如行为测试。你的代码无法编译。从解决这个问题开始。然后意识到将断言放在try块中并不是您需要做的事情。您需要做的是(如果您真的不希望JUnit5支持异常测试),将对方法的调用放在try块中。你的一些测试对我来说没什么意义。在编写代码之前,我建议您编写测试的文本描述,比如“从空堆栈中弹出一个元素会引发异常,因为没有要弹出的内容”。在testTC3中这样做可能会让您认识到自己的错误。但是为什么你想达到100%的分支覆盖率呢?不要在评论中发表你的意见。编辑我们的问题。如果您正在使用,为什么这个问题有标签?请显示您的测试。又一个问题:为什么要实现100%的分支机构覆盖率?我建议编写有价值的测试,例如行为测试。你的代码无法编译。从解决这个问题开始。然后意识到将断言放在try块中并不是您需要做的事情。您需要做的是(如果您真的不希望JUnit5支持异常测试),将对方法的调用放在try块中。你的一些测试对我来说没什么意义。在编写代码之前,我建议您编写测试的文本描述,比如“从空堆栈中弹出一个元素会引发异常,因为没有要弹出的内容”。在testTC3中这样做可能会让您意识到自己的错误。“您需要3个unity测试来完全覆盖这一个”-我会质疑这一说法。如果您指的是分支覆盖率,那么一个“仅”需要两种情况(
    pointer
    pointer>=capacity
    )。如果你想实现C3覆盖。。。好。。。祝你好运。对于分支机构的保险,我会同意的。我发现为边缘案例编写测试很容易发现真正的逻辑错误。这就是为什么我说要完全涵盖这一点。我会更新答案,让它更清楚。“你需要3个统一测试来完全覆盖这一个”-我会质疑这一说法。如果您指的是分支覆盖率,那么一个“仅”需要两种情况(
    pointer
    pointer>=capacity
    )。如果想要实现C3覆盖率。。。好。。。祝你好运。对于分支机构的保险,我会同意的。我发现为边缘案例编写测试很容易发现真正的逻辑错误。这就是为什么我说要完全涵盖这一点。我将更新答案以澄清问题。我在yourObject上收到一个错误,我将用什么替换它?也非常感谢您提供了这个有用的答案,这是调用函数的类对象。我在yourObject上收到一个错误,我应该用什么来替换它?也非常感谢您提供了这个有用的答案,即调用函数的类对象。