断言方法
正如我们可能从简单测试中发现的那样,实现JUnit单元测试的大部分秘密在于使用org.junit.Assert类中的assert方法。在本文中,我将仔细研究此类中提供哪些断言方法。
这是assert方法的列表:
- assertArrayEquals()
- assertEquals()
- assertTrue()+ assertFalse()
- assertNull()+ assertNotNull()
- assertSame()+ assertNotSame()
- assertThat()
在本文的其余部分中,我将解释这些断言方法的工作方式,并向我们展示如何使用它们的示例。这些示例将测试一个名为" MyUnit"的虚构类。该类的代码未显示,但是我们实际上并不需要该代码来了解如何对其进行测试。
assertArrayEquals()
AssertArrayEquals()方法将测试两个数组是否相等。换句话说,如果两个数组包含相同数量的元素,并且数组中的所有元素彼此相等。
为了检查元素是否相等,使用数组的equals()方法比较数组中的元素。更具体地说,每个数组的元素都使用其equals()方法进行比较。这意味着仅两个数组包含相同的元素是不够的。它们也必须以相同的顺序出现。
这是一个例子:
import org.junit.Test; import static org.junit.Assert.*; public class MyUnitTest { @Test public void testGetTheStringArray() { MyUnit myUnit = new MyUnit(); String[] expectedArray = {"one", "two", "three"}; String[] resultArray = myUnit.getTheStringArray(); assertArrayEquals(expectedArray, resultArray); } }
首先,创建期望的数组。其次,调用" myUnit.getTheStringArray()"方法,这是我们要测试的方法。第三,将" myUnit.getTheStringArray()"方法调用的结果与预期数组进行比较。
如果数组相等,则" assertArrayEquals()"将继续进行而不会出现错误。如果数组不相等,则将引发异常,并且测试将中止。 AssertArrayEquals()之后的任何测试代码都不会执行。
assertEquals()
" assertEquals()"方法使用其" equals()"方法比较两个对象是否相等。
这是一个简单的示例:
import org.junit.Test; import static org.junit.Assert.*; public class MyUnitTest { @Test public void testConcatenate() { MyUnit myUnit = new MyUnit(); String result = myUnit.concatenate("one", "two"); assertEquals("onetwo", result); } }
首先调用" myUnit.concatenate()"方法,并将结果存储在变量"结果"中。
其次,使用assertEquals()方法将结果值与期望值" onetwo"进行比较。
如果两个对象根据其equals()方法的实现是相等的,则assertEquals()方法将正常返回。否则," assertEquals()"方法将引发异常,并且测试将在那里停止。
这个例子与String对象进行了比较,但是assertEquals()方法可以将任意两个对象进行比较。 AssertEquals()方法也有一些版本,它们将原始类型(如int和float)相互比较。
assertTrue()+ assertFalse()
" assertTrue()"和" assertFalse()"方法测试单个变量,以查看其值是" true"还是" false"。这是一个简单的示例:
import org.junit.Test; import static org.junit.Assert.*; public class MyUnitTest { @Test public void testGetTheBoolean() { MyUnit myUnit = new MyUnit(); assertTrue (myUnit.getTheBoolean()); assertFalse(myUnit.getTheBoolean()); } }
如我们所见,对myUnit.getTheBollean()
的方法调用内联在assertTrue()
assertFalse()
内。
如果getTheBoolean()方法返回true,则assertTrue()方法将正常返回。否则,将引发异常,并且测试将在此处停止。
如果getTheBoolean()方法返回false,则assertFalse()方法将正常返回。否则,将引发异常,并且测试将在此处停止。
当然,如果getTheBoolean()
方法在两个调用中返回相同的值,则上述测试将在" assertTrue()"或者" assertFalse()"调用中失败。 " assertTrue()"或者" assertFalse()"调用之一将失败。
assertNull()+ assertNotNull()
" assertNull()"和" assertNotNull()"方法测试单个变量以查看其是否为" null"或者" null"。这是一个例子:
import org.junit.Test; import static org.junit.Assert.*; public class MyUnitTest { @Test public void testGetTheObject() { MyUnit myUnit = new MyUnit(); assertNull(myUnit.getTheObject()); assertNotNull(myUnit.getTheObject()); } }
在" assertNull()"和" assertNotNull()"调用中内联了对" myUnit.getTheObject()"的调用。
如果myUnit.getTheObject()
返回null,则assertNull()
方法将正常返回。如果返回非null值,则assertNull()
方法将引发异常,并且测试将在此处中止。
" assertNotNull()"方法与" assertNull()"方法相反,如果将null值传递给它,则抛出异常;如果将非null值传递给它,则正常返回。
assertSame()和assertNotSame()
" assertSame()"和" assertNotSame()"方法测试两个对象引用是否指向同一对象。根据两个对象的equals()方法,使两个对象相等是不够的。它必须与指向的对象完全相同。
这是一个简单的示例:
import org.junit.Test; import static org.junit.Assert.*; public class MyUnitTest { @Test public void testGetTheSameObject() { MyUnit myUnit = new MyUnit(); assertSame (myUnit.getTheSameObject(), myUnit.getTheSameObject()); assertNotSame(myUnit.getTheSameObject(), myUnit.getTheSameObject()); } }
对myUnit.getTheSameObject()的调用被内联到AssertSame()和AssertNotSame()方法调用中。
如果两个引用指向同一个对象,则" assertSame()"方法将正常返回。否则,将引发异常,并且测试将在此处停止。
" assertNotSame()"方法与" assertSame()"方法相反。如果两个对象没有指向相同的对象,则" assertNotSame()"方法将正常返回。否则将引发异常,并且测试将在此处停止。
assertThat()
" assertThat()"方法将一个对象与" org.hamcrest.Matcher"进行比较,以查看给定对象是否与" Matcher"要求匹配的对象相匹配。
匹配器需要花费更长的时间来解释,因此将在各自的文本(此跟踪的下一个文本)中进行解释。