Exceptions erwarten

Expected Exception - Exceptions erwarten

Im Idealfall werden in einem Unittest alle möglichen Ausführungswege im Code getestet. Im Fall eines Fehlers sollte sichergestellt werden, dass eine bestimmte Exception ausgelöst wird.

Mit einem Assert kann das auftreten einer Exception nicht geprüft werden, da der Punkt der Prüfung im Unittest nicht erreicht würde. Die einzige Möglichkeit dies zu testen wäre ein try/catch Block im Unittest. Da dies jedoch schwierig zu verstehen ist, gibt es eine eigene Annotation dafür Namens „@expectedException“.


In dieser Annotation wird die erwartete Exception definiert und der Testfall ist nur dann grün, wenn die Exception auftritt.


Das folgende Beispiel zeigt eine CalculationService, der die einfachen Operationen „add“ und „devide“ bietet. Der Wert 0 ist für die Methode „devide“ nicht erlaubt, da in der Mathematik eine Division durch 0 nicht erlaubt ist. Aus diesem Grund wird im Faller einer Division durch 0 eine Exception ausgelöst:

class CalculationService {
	protected $result = 0.0;

	/**
	* @param float $value
	* @return CalculationService
	*/
	public function add($value) {
		$this->result += $value;
		return $this;
	}

	/**
	* @param float $value
	* @return CalculationService
	*/
	public function devide($value) {
		if($value == 0) {
			$message = "Division by zero is not allowed";
			throw new InvalidArgumentException();		
		} else {
			$this->result = $this->result / $value;
		}

		return $this;
	}

	/**
	* @return float
	*/
	public function getResult() {
		return $this->result;
	}
}

Im Testfall wird geprüft, ob der Service bei einer Division mit Null tatsächlich auch eine Exception auslöst. Dies geschiet durch die Annotation „@expectedException InvalidArgumentException“:


class CalculationServiceTest extends PHPUnit_Framework_TestCase {

	/**
	* @var CalculationService
	*/
	protected $calc;

	public function setUp() {
		$this->calc = new CalculationService();
	}

	/**
	* @test
	*/
	public function testCanAdd() {
		$this->calc->add(2)->add(4)->add(3);
		$result = $this->calc->getResult();		
		$this->assertEquals(9,$result,'Add delivered wrong result');
	}

	/**
	* @test
	*/
	public function testCanDevide() {
		$this->calc->add(20)->devide(5);
		$result = $this->calc->getResult();
		$this->assertEquals(4.0, $result,'Devided delivered wrong result');	
	}

	/**
	* @test
	* @expectedException InvalidArgumentException
	*/
	public function testDevidedThrowsExceptionWithZero() {
		$this->calc->add(10)->devide(0);
		$result = $this->calc->getResult();
	}
}

Navigation