1.介绍
在本文中,我们将详细探讨JUnit中可用的断言。
后,从JUnit 4迁移到JUnit 5和JUnit 5指南,现在我们将详细讨论JUnit 4和JUnit 5中可用的不同断言。金宝搏官网188be
我们还将重点介绍JUnit 5对断言的增强。
2.断言
断言是支持测试中断言条件的实用方法;这些方法可以通过断言类,以及断言一个是在JUnit 5中。
为了增加测试和断言本身的可读性,总是建议这样做进口静态地指定相应的类。通过这种方式,我们可以直接引用断言方法本身,而不必将表示类作为前缀。
让我们开始研究JUnit 4中可用的断言。
3.JUnit 4中的断言
在这个版本的库中,断言可用于所有基本类型,对象,和数组(原语或对象)。
在断言中,参数的顺序是期望值后面跟着实际值;可选第一个参数可以是字符串表示已计算条件的消息输出的消息。
在定义上只有一点细微的不同为了断言,但我们将在后面介绍它。
让我们从assertequal一个。
3.1.assertequal
的assertequal断言验证预期值和实际值是否相等:
@Test public void whenAssertingEquality_thenEqual() {String expected = "B金宝搏188体育aeldung";String actual = "金宝搏188体育Baeldung";assertequal(预期,实际);}
当断言失败时,也可以指定要显示的消息:
assertEquals("失败-字符串不相等",预期,实际);
3.2。assertArrayEquals
如果要断言两个数组相等,可以使用assertArrayEquals:
@Test public void whenAssertingArraysEquality_thenEqual() {char[] expected = {'J','u','n','i','t'};char[] actual = "Junit".toCharArray();assertArrayEquals(预期,实际);}
如果两个数组都是零,断言会认为它们相等:
@Test public void givenNullArrays_whenAssertingArraysEquality_thenEqual() {int[] expected = null;Int[]实际= null;assertArrayEquals(预期,实际);}
3.3.assertNotNull和assertNull
当我们想要测试一个对象是否零我们可以使用assertNull断言:
@Test public void whenAssertingNull_thenTrue(){对象汽车= null;assertNull("汽车应该是空的",汽车);}
反过来,如果要断言一个对象不应该为空,可以使用assertNotNull断言。
3.4.assertNotSame和assertSame
与assertNotSame,可以验证两个变量是否指向同一个对象:
@Test public void whenassertingnotameobject_thendifferent(){对象cat = new对象();对象狗=新的对象();assertNotSame(猫、狗);}
否则,当需要验证两个变量是否指向同一个对象时,可以使用assertSame断言。
3.5。assertTrue和assertFalse
如果我们想验证某个条件真正的或假,我们可以分别使用assertTrue断言或assertFalse一:
@Test public void whenAssertingConditions_thenVerified() {assertTrue("5大于4",5 > 4);assertFalse("5不大于6",5 > 6);}
3.6。失败
的失败断言失败时抛出AssertionFailedError.它可以用于验证是否抛出了一个实际的异常,或者当我们想要在其开发期间进行测试失败时。
让我们看看如何在第一个场景中使用它:
@Test public void whenCheckingExceptionMessage_thenEqual() {try {methodThatShouldThrowException();失败(“异常不抛出”);} catch (UnsupportedOperationException e) {assertEquals(“操作不支持”,e.t getmessage ());}}
3.7。为了
的为了断言是JUnit 4中唯一一个参数顺序与其他断言相反的断言。
在这种情况下,断言有一个可选的失败消息、实际值和一个匹配器对象。
让我们看看如何使用这个断言来检查数组是否包含特定的值:
@Test public void testAssertThatHasItems() {assertThat(数组。asList(“Java”、“芬兰湾的科特林”、“Scala”),hasItems(“Java”、“芬兰湾的科特林”));}
附加信息,关于强大的使用为了断言的匹配器对象,可在测试与Hamcrest.
4.JUnit断言5
JUnit 5保留了JUnit 4的许多断言方法,同时增加了一些利用Java 8支持的新方法。
同样在这个版本的库中,断言可用于所有基本类型,对象,和数组(原语或对象)。
断言参数的顺序发生了改变,将输出消息参数移动为最后一个参数。由于Java 8的支持,输出消息可以是供应商,允许延迟评估它。
让我们开始检查JUnit 4中可用的断言。
4.1。assertArrayEquals
的assertArrayEquals断言验证预期数组和实际数组是否相等:
@Test public void whenAssertingArraysEquality_thenEqual() {char[] expected = {'J', 'u', 'p', 'i', 't', 'e', 'r'};char[] actual = "Jupiter".toCharArray();assertArrayEquals(期望的,实际的,“数组应该相等”);}
如果数组不相等,则消息"数组应该相等将显示为输出。
4.2。assertequal
如果我们想要断言2浮点数是等号,我们可以用简单的assertequal断言:
@Test public void whenAssertingEquality_thenEqual() {float square = 2 * 2;浮动矩形= 2 * 2;assertequal(正方形、长方形);}
但是,如果我们想断言实际值与期望值相差一个预定义的增量,我们仍然可以使用assertequal但我们必须将增量值作为第三个参数传递:
@Test public void whenAssertingEqualityWithDelta_thenEqual() {float square = 2 * 2;浮动矩形= 3 * 2;Float delta = 2;assertequal(正方形、长方形,δ);}
4.3。assertTrue和assertFalse
与assertTrue断言时,可以验证所提供的条件是真正的:
@Test public void whenAssertingConditions_thenVerified() {assertTrue(5 > 4, "5 is greater the 4");assertTrue(null == null,“null等于null”);}
由于对lambda表达式的支持,可以提供BooleanSupplier以断言而不是布尔条件。
我们看看如何断言a的正确性BooleanSupplier使用assertFalse断言:
@Test public void givenBooleanSupplier_whenAssertingCondition_thenVerified() {BooleanSupplier condition = () -> 5 > 6;assertFalse(条件,“5不大于6”);}
4.4.assertNull和assertNotNull
当我们想断言一个对象不是零我们可以使用assertNotNull断言:
@Test public void whenAssertingNotNull_thenTrue(){对象狗=新对象();assertNotNull(dog, () -> "The dog should not be null");}
反过来,我们可以用theassertNull断言,以检查实际是否为零:
@Test public void whenAssertingNull_thenTrue(){对象cat = null;assertNull(cat, () -> "The cat should be null");}
在这两种情况下,失败消息都将以惰性方式检索,因为它是供应商.
4.5。assertSame和assertNotSame
当我们想要断言预期的和实际的引用相同对象,我们必须使用assertSame断言:
@Test public void whenAssertingSameObject_thenSuccessfull() {String language = "Java";可选 Optional = Optional.of(language);assertSame(语言、optional.get ());}
反过来,我们可以用theassertNotSame一个。
4.6。失败
的失败断言使用提供的失败消息以及根本原因导致测试失败。当一个测试还未完成时,这可以用来标记它:
@Test public void whenFailingATest_thenFailed(){//测试未完成失败(“失败-测试未完成”);}
4.7。assertAll
JUnit 5中引入的一个新断言是assertAll.
此断言允许创建分组断言,在分组断言中执行所有断言,并将它们的失败一起报告。在详细信息中,此断言接受一个标题,该标题将包含在MultipleFailureError和一个流的可执行文件。
让我们定义一个分组断言:
@Test public void givenMultipleAssertion_whenAssertingAll_thenOK() {assertAll("heading", () -> assertEquals(4, 2 * 2, "4是2乘以2"),()-> assertEquals("java", "java" .toLowerCase()), () -> assertEquals(null, null, "null等于null"));}
只有当其中一个可执行文件抛出黑名单异常(OutOfMemoryError例如)。
4.8。assertIterableEquals
的assertIterableEquals断言预期的可迭代对象和实际的可迭代对象深度相等。
为了相等,两个可迭代对象必须返回相同顺序的相等元素,并不要求这两个可迭代对象具有相同的类型才能相等。
考虑到这一点,让我们看看如何断言两个不同类型的列表(LinkedList和ArrayList例如)是相等的:
@Test public void givenTwoLists_whenAssertingIterables_thenEquals() {Iterable al = new ArrayList<>(“Java”,“Junit”,“测试”));Iterable ll = new LinkedList<>(asList(“Java”,“Junit”,“测试”));assertIterableEquals (al, ll);}
用同样的方法assertArrayEquals,如果两个可迭代对象都为空,则认为它们相等。
4.9。assertLinesMatch
的assertLinesMatch的预期列表字符串与实际列表匹配。
这种方法不同于assertequal和assertIterableEquals因为,对于每一对期望的和实际的线,它执行这个算法:
- 检查期望的线是否等于实际的线。如果是,则继续下一对
- 将期望的行视为正则表达式,并使用字符串.匹配()方法。如果是,则继续下一对
- 检查所期望的行是否为快进标记。是= >应用快进算法,从步骤1开始重复该算法
让我们看看如何使用这个断言断言两个列表字符串有匹配的行:
@Test public void whenAssertingEqualityListOfStrings_thenEqual(){列表 expected = asList(“Java”,“\\d+”,“JUnit”);List actual = asList(“Java”,“11”,“JUnit”);assertLinesMatch(预期,实际);}
4.10。assertNotEquals
互补的assertequal,assertNotEquals断言断言预期值和实际值不相等:
@Test public void whenAssertingEquality_thenNotEqual(){整型值= 5;//算法的结果assertNotEquals(0, value, "结果不能为0");}
如果两者都是零,断言失败。
4.11。assertThrows
为了增加简洁性和可读性,新assertThrows断言允许我们用一种清晰而简单的方式断言可执行程序是否抛出指定的异常类型。
让我们看看如何断言抛出的异常:
@Test void whenAssertingException_thenThrown() {Throwable exception = assertThrows(IllegalArgumentException.class,() ->{抛出新的IllegalArgumentException(“异常消息”);});assertequal(“异常消息”,exception.getMessage ());}
如果没有抛出异常,或者抛出不同类型的异常,断言将失败。
4.12。assertTimeout和assertTimeoutPreemptively
如果我们想断言一个提供的执行可执行的在给定的时间之前结束超时,我们可以使用assertTimeout断言:
@Test public void whenAssertingTimeout_thenNotExceeded() {assertTimeout(ofSeconds(2),() ->{//需要少于2分钟执行Thread.sleep(1000)的代码;});}
然而,随着assertTimeout断言时,所提供的可执行文件将在调用代码的同一个线程中执行。因此,如果超过了超时时间,供应商的执行将不会被抢先中止。
如果我们想确保一旦超过超时,可执行文件的执行将被中止,我们可以使用assertTimeoutPreemptively断言。
两个断言都可以接受,而不是可执行文件,一个ThrowingSupplier,表示返回一个对象并可能抛出可抛出。
5.结论
在本教程中,我们讨论了JUnit 4和JUnit 5中可用的所有断言。
我们简要介绍了JUnit 5中的改进,引入了新的断言和对lambdas的支持。
与往常一样,本文的完整源代码是可用的在GitHub.