【问题标题】:Constructor call must be the first statement in a constructor when there is no constructor call at all当根本没有构造函数调用时,构造函数调用必须是构造函数中的第一条语句
【发布时间】:2017-01-01 10:21:57
【问题描述】:

我正在尝试为http://www.keithschwarz.com/interesting/code/?dir=fibonacci-heap中提供的代码编写单元测试

虽然我被困在第一行。我的测试如下所示:

public class fibonacciHeapTest {


    fibonacciHeap<Integer> fibHeap= new fibonacciHeap<>();

    @Test(expected = HeapEmptyException.class)
    public void testGetMin() throws HeapEmptyException {

        System.assert(true, fibHeap.isEmpty()); // Here I get the error mentioned in the title.

    }

在查看 System 时也是同一行,在下拉列表中显示以下消息:系统无法解析为变量。

我做错了什么?谢谢。

【问题讨论】:

  • 使用 org.junit.Assert,而不是 System.assert
  • 另外,请遵守 Java 命名约定。类以大写字母开头。
  • @Jens 也不起作用。我有以下错误:org.junit 无法解析为类型
  • @JBNizet 我将研究 Java 约定。谢谢。
  • 你必须将 junit 添加为依赖项

标签: java unit-testing junit


【解决方案1】:

让我们提供一些更准确的反馈来帮助您前进:

public class FibonacciHeapTest { // 如前所述,大写!

您的第一个测试可能是:

@Test 
public void testIsEmptyOnNewHeap() {
  assertThat(new FibonnacciHeap<String>().isEmpty(), is(true));
}

重点是:isEmpty() 显然应该抛出异常,所以你不想要“预期的”语句。请注意:我转向 assertThat 和 hamcrest is 匹配器 - 不要浪费时间学习其他断言。 assertThat 是您唯一需要的断言。 (但要了解它需要一些阅读)

然后:

@Test(expected=HeapEmptyException.class) 
public void testGetOnEmptyHeap() {
   new FibonacciHeap<String>().pop();
}

这里的重点:你的堆有一个获取值的方法,我称之为“pop()”。很明显 - 当你从一个空堆栈中弹出一些东西时,你应该会看到一个异常。

这些是您如何编写单元测试的一些示例。您在测试中做了一件事;你检查一件事;要么使用断言,要么期待异常。

【讨论】:

  • 我指的是developer.salesforce.com/page/How_to_Write_Good_Unit_Tests。如果我的单元测试应该只做一件事,或者测试一种方法的所有案例,我会感到困惑。我会很感激澄清
  • 一个 test 方法应该测试一个特定的功能。 “功能”是:从空堆中弹出一些东西。放入一个东西,然后检查 pop 是否返回你放入的东西。等等。所以,是的,有时您的测试方法会调用您的几种生产方法。所以这个想法是您的测试方法之间存在最小重叠。尽管在实践中,这并不总是可行的。
猜你喜欢
  • 1970-01-01
  • 2013-12-10
  • 2020-07-12
  • 2012-12-13
  • 2011-03-24
  • 2016-11-26
  • 2018-05-30
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多