DUnitで例外の発生をテストする方法
結論
テストするメソッドに引数がない場合はCheckExceptionを使用する。
テストするメソッドに引数がある場合はStartExpectingException~StopExpectingExceptionを使用する。
例
クラスTFooは例外を発生する2つのメソッドBarとBazを持つ。
Barメソッドは引数をとらず、Bazメソッドは引数をとる
TFoo = class
public
procedure Bar;
procedure Baz(I: Integer);
end;
procedure TFoo.Bar;
begin
raise EProgrammerNotFound.Create('エラー');
end;
procedure TFoo.Baz(I: Integer);
begin
if I = 0 then raise EArgumentException.Create('エラー');
end;
引数をとらないBarメソッドが例外を発生させることをテストするには、CheckExceptionを使用する。
CheckExceptionは第1引数にメソッドポインタ、第2引数に発生する例外の型を取る。
procedure TestTFoo.TestBar;
var
Foo: TFoo;
begin
Foo := TFoo.Create;
CheckException(Foo.Bar, EProgrammerNotFound);
end;
引数をとるBazメソッドが例外を発生させることをテストするには、StartExpectingException~StopExpectingExceptionを使用する。
StartExpectingExceptionは引数に発生する例外の型を取る。
StartExpectingExceptionとStopExpectingExceptionの間で、テストするメソッドを呼ぶ。
procedure TestTFoo.TestBaz;
var
Foo: TFoo;
begin
Foo := TFoo.Create;
StartExpectingException(EArgumentException);
Foo.Baz(0);
StopExpectingException();
end;