JUnit我应该使用什么断言

JUnit我应该使用什么断言,junit,assert,assertion,Junit,Assert,Assertion,我想寻求帮助和建议,在我的案例中什么是正确的方法(可能很简单,但我只是从JUnit开始)。这是我代码的一部分 public boolean arrayListEmpty() { if(numericalSequence.isEmpty() == true) return true; else return false; } 这是一个来自模型的公共方法,我想我应该测试它,如果我的numericalse

我想寻求帮助和建议,在我的案例中什么是正确的方法(可能很简单,但我只是从JUnit开始)。这是我代码的一部分

public boolean arrayListEmpty()
    {
        if(numericalSequence.isEmpty() == true)
            return true;
        else
            return false;
    }
这是一个来自模型的公共方法,我想我应该测试它,如果我的numericalsequence是空的,正如您所看到的,它将返回true。我不能直接调用numericalSequence.isEmpty(在我需要它的控制器中)检查它,因为它是私有的。 所以最明显的事情就是检查

assertEquals(true, test.arrayListEmpty());

所以我的问题是关于建议我应该使用什么其他断言/我应该预测哪些案例会出现。在测试方法中,我是否应该用一些值填充numericalSequence并断言它?(对我来说,这并不是必需的,因为任何插入序列的值都=notnull,但可能不是那么容易)

首先,欢迎使用堆栈溢出

看看你的问题,听起来你是单元测试新手(如果我错了,请纠正我)。因此,我将把我的答案分成两部分;(1) 回答你的问题,(2)给出如何编写好的测试和可测试类的一般指导

1。回答您的问题

您可以在这里想到更多的用例:

  • 如果
    numericalSequence
    null
    ,会发生什么情况
  • 如果
    numericalSequence
    有一个元素会怎么样
  • 如果
    numericalSequence
    有一个空元素怎么办
  • 根据类的设置方式,上面的一些情况可能不可能发生,但这是一个值得进行的测试,因此,对违反其中一个测试用例的“先前约定的行为”的类所做的任何更改都将失败

    2。编写良好的测试

    对于如何编写好的测试没有严格的指导原则,但是,如果您将代码构造为可测试的,您会发现编写好的测试变得更容易,而且工作量也会减少。请允许我解释一下

    注意:这不是一个全面的指南,但旨在开始您的旅程,了解如何编写更好的代码和更好的测试

    因此,假设需要测试的类是这样编写的:

    class MyClass {
      // NOTE: This is not `final`
      private List<Integer> numericalSequence;
    
      public MyClass() {
        this.numericalSequence = new ArrayList<>();
      }
    
      public void doSomething(Integer x) {
        if (x < 0) {
          numericalSequence = new ArrayList<>();
        } else {
          numericalSequence.add(2 * x);
        }
      }
    
      public boolean arrayListEmpty() {
        // NOTE: Your sample code can be reduced to this one-liner
        return numericalSequence.isEmpty();
      }
    }
    
    关于上述结构,需要注意以下几点:

  • 有两名施工人员;缺省值调用一个以整数列表为序列的函数,以便重用两者需要共享的任何逻辑。本例中没有逻辑,但希望您很快就会遇到
  • doSomething()
    方法不接受
    Integer
    值,但接受确保
    x
    永远不为
    null
    (Java数值基元类型不能为
    null
    )的
    int
    值。这也意味着,
    numericalSequence
    不能通过
    doSomething()
    包含空值
  • 由于
    numericalSequence
    可以从此类外部初始化,因此
    arrayListEmpty()
    方法确保检查
    numericalSequence
    是否为
    null
    是否为空
  • 现在您可以这样编写测试用例:

    @Test
    public void arrayListEmpty_WhenListIsNull() {
      MyClass test = MyClass(null);
      assertTrue(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListIsEmpty() {
      MyClass test = MyClass();
      assertTrue(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListHasOnlyOneNonNullElement() {
      List<Integer> sequence = new ArrayList<>();
      sequence.add(0);
      MyClass test = new MyClass(sequence);
      assertFalse(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListHasOnlyOneNullElement() {
      List<Integer> sequence = new ArrayList<>();
      sequence.add(null);
      MyClass test = new MyClass(sequence);
      assertFalse(test.arrayListEmpty());
    }
    
    我的意图是展示两件事:

  • 将您的测试用例组织为小而简洁
  • 将类设计为易于测试
  • 希望这有帮助

    @Test
    public void arrayListEmpty_WhenListIsNull() {
      MyClass test = MyClass(null);
      assertTrue(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListIsEmpty() {
      MyClass test = MyClass();
      assertTrue(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListHasOnlyOneNonNullElement() {
      List<Integer> sequence = new ArrayList<>();
      sequence.add(0);
      MyClass test = new MyClass(sequence);
      assertFalse(test.arrayListEmpty());
    }
    
    @Test
    public void arrayListEmpty_WhenListHasOnlyOneNullElement() {
      List<Integer> sequence = new ArrayList<>();
      sequence.add(null);
      MyClass test = new MyClass(sequence);
      assertFalse(test.arrayListEmpty());
    }
    
    @Test
    public void doSomething_WhenInputLessThanZero() {
      List<Integer> sequence = new ArrayList<>();
      sequence.add(0);
      MyClass test = new MyClass(sequence);
      test.doSomething(-1);
      assertTrue(test.arrayListEmpty());
    }