JUnit测试isEmpty()栈方法

3

我目前正在学习如何实现JUnit测试,但是我对于Stack实现中的isEmpty()方法感到困惑。这是我想要测试的方法:

boolean isEmpty(){
    if(firstFree == 0) return true;
    else return false;
}

这是我的测试:

public void isEmptyTest(){
    assertTrue(onpStack.isEmpty());
    assertFalse(onpStack.isEmpty());
}

无论堆栈中是否有元素,测试结果都是一样的失败。我知道原因:因为它不能同时拥有和不拥有元素。我无法想出如何使测试在两种情况下都通过。有没有正确的方法?还是应该针对这个isEmpty()方法分别做两个不同的测试?


是的,你应该为每个预期输出编写单独的单元测试。 - Nico Van Belle
1
你应该为每个条件分支编写单独的测试。在你的情况下,如果(firstFree == 0)... 这就是单元测试的基础,也是它们被称为这样的原因。 - Maciej Kowalski
1
在你的第二个断言之前向堆栈中添加一个元素。 - Stefan Warminski
@StefanWarminski 是的!那正是我想要实现的。但是,多亏了其他答案,我现在对这种实现方式是否好奇起来了 :P - shurrok
一个新手的好问题!简洁明了! - GhostCat
显示剩余2条评论
2个回答

8

单元测试(Unit tests)顾名思义是用来测试代码的一部分。一个栈不能同时为空和非空。建议将测试用例分成以下几个部分:

public void isEmptyTest(){
  Stack emptyStack = new Stack();
  assertFalse(emptyStack.isEmpty());
}

public void isEmptyTest(){
  Stack nonEmptyStack = new Stack();
  nonEmptyStack.push(1);
  assertFalse(nonEmptyStack.isEmpty());
}

我建议你使用一个简短的方式来编写isEmpty()方法,这样可以使代码更干净、更易懂。
boolean isEmpty(){
   return (firstFree == 0);
}

希望这有所帮助!

@Buszman 这就是测试的重点:你开始做你需要运行测试的 确切 设置。你还想在哪里为测试做准备呢?! - GhostCat
@GhostCat,我从教程中学到,在SetUp()方法中使用before标签设置被测试的变量或者简单地初始化类中的元素,这就是为什么我在问的原因。 - shurrok
1
@Buszman 这两种方式都可以。有时候,在测试类中设定一个字段并在 @setup 中进行设置是非常有用的。有时候,就像这里的例子一样,你只需要为每个测试创建一个特定的实例。这样做的原因很简单,因为它使得测试自包含。 - GhostCat
1
@Buszman 在像这样简单的情况下,设置方法通常是多余的,但如果你的设置更加复杂,它就非常有用。 - Rhayene
1
@Buszman A) 整个想法是你有一个X.java和XTest.java;其中XTest应该包含X的所有测试(如果这对你不起作用,那么你在某个地方犯了错误)。B) 我们不应该通过评论来进行更多问题的提问游戏 - 当你有一个新问题时,请写一个新问题。但特别是在这里:考虑做更多的研究。你所询问的大多数事情应该在很多地方都有文档记录。C) 关于更多问题的事情...如果你想进一步表达我评论的帮助性,请随意在其他地方点赞我的内容;-) - GhostCat
显示剩余2条评论

0
  • 对于第一种情况,使用空堆栈对象来测试isEmpty()方法,应返回true。
  • 对于第二种情况,使用非空堆栈对象来测试isEmpty()方法,应返回false。

这是我在发帖之前已经完成的工作。我想把这两件事合并到一个测试中,不知道是否可能。 - shurrok
我想要测试这个方法。如果你想要检查栈是否为空,我会在代码中使用这个方法本身 :O - shurrok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接