JUnit 断言

可用

6.1 断言

断言是可以插入代码不同位置的特殊检查。他们的任务是确定出了什么问题。或者更确切地说,检查一切是否按预期进行。这是“根据需要”,它们允许您以各种方式进行设置。

您已经在上面的代码中遇到过一些断言。第一个是检查对象是否相等。如果对象不相等,将抛出异常并且测试将失败。

比较的顺序在这里很重要,因为最终报告中的 JUnit 会写类似“收到值 1,但预期为 3”的内容。这种检查的一般格式是:

assertEquals(standard , meaning)

例子:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 方法 assertEquals、assertTrue、assertFalse

下面我将列出最流行的方法——断言。通过它们的名字很可能猜出它们是如何工作的。但无论如何我都会写一个简短的解释:

断言等于 检查两个对象是否相等
断言数组相等 检查两个数组是否包含相等的值
assertNotNull 检查参数是否不为空
断言为空 检查参数是否为空
断言不相同 检查两个参数不是同一个对象
断言相同 检查两个参数是否是同一个对象
断言为真 检查参数是否为
断言假 检查参数是否为

其中一些方法似乎是多余的。既然可以写assertTrue(a == b) ,为什么还要使用assertSame( a, b)呢?

关键是assert是一种非常聪明的方法。它做了很多有用的事情,包括将错误信息写入日志。在第一种情况下,它会写 object A was expected, but object B was received. 在第二种情况下,它会简单地写成 true was expected 。

当您有数百个测试时,尤其是那些在专用测试服务器上运行的测试,拥有详细的日志会非常有帮助。我想你明白我的意思。

数组比较示例:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 assertAll 方法

上面说了,assert方法不仅进行检查,还会向日志中写入很多可比对象的信息。

我们来做个比较:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

但如果其中一个参数不匹配,则不会检查其余参数。但我希望它们仍然发生,并将它们的结果记录在日志中。但与此同时,如果至少有一项检查失败,则测试仍然失败。

为此有一个特殊的方法 - assertAll()。作为第一个参数,它需要一条要写入日志的注释,然后是任意数量的断言函数。

下面是我们的示例将如何用它重写:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

然后如果地址不正确,日志中将写入如下内容:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 assertTimeout方法

还记得@Timeout注释吗?它允许控制整个方法的执行时间。但有时对方法内部某些部分代码的执行设置限制是有用的。您可以为此使用assertTimeout()

时间作为第一个参数传递,必须在指定时间内执行的代码(函数)作为第二个参数传递。例子:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Assert类有assertTimeout()方法的 12 种变体。如果你想了解更多关于它们的信息,欢迎阅读官方文档

6.5 assertThrows 方法

很多情况下,您需要确保在特定情况下代码抛出正确的异常:它检测到错误并抛出正确的异常。这是一种很常见的情况。

在这种情况下,还有另一个有用的断言方法——这是assertThrows()。其调用的一般格式为:

assertThrows(exception , code)

基本上,它与assertTimeout()方法非常相似,只是它检查指定的代码是否抛出正确的异常。例子:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论