断言方法

时间:2020-01-09 10:35:38  来源:igfitidea点击:

正如我们可能从简单测试中发现的那样,实现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"要求匹配的对象相匹配。

匹配器需要花费更长的时间来解释,因此将在各自的文本(此跟踪的下一个文本)中进行解释。