The eval in Testing::DESTROY is called before you print the error. So the script has already forgotten the previous error.
You should localize $@ before you run eval blocks.
This should do the fix.
sub DESTROY {
my $self = shift;
local $@;
eval { $self->{tree} = $self->{tree}->delete(); };
}