如何触发多次调用Finalize方法?

5
在最近的AdaCore Gem中,有这样一句话:AdaCore Gem
Finalize的实现略微复杂:Ada参考手册指出Finalize过程应始终是幂等的。当异常发生时,Ada编译器可以自由地在同一对象上多次调用Finalize。
我需要测试一个私有控制类型。
   type T is private;
private
   type T is new Ada.Finalization.Controlled with ...

我可以更改源代码,使类型可见并受控制。
   type T is new Ada.Finalization.Controlled with private;

然后只需调用Finalize(My_T);(甚至是My_T.Finalize?); 但是有没有办法在不更改被测试软件的情况下执行多个终结操作?


1
哇,这个问题让我束手无策。我能想到的最好的办法就是找出导致编译器执行多次finalize的条件(如果有的话),然后尝试诱发它。但这并不会产生可移植的测试。 - T.E.D.
也许我只需要接受它必须被可视化控制的事实。即使增加一些本来不需要的脚手架,使其可测试会更好。 - Simon Wright
1个回答

3

为了测试,我使用一个子包。它允许测试私有部分。 假设您的包是:

package A is
   type T is private;
private
   type T is new Ada.Finalization.Controlled with ...
end A;

我会使用类似以下的方式进行测试:

package body A.Test is
   procedure Test_Finalize is
       My_T : T;
   begin
       My_T.Finalize;
   end Test_Finalize;
end A.Test;

我也发现特殊的子包(有时称为“私生子包”)对于单元测试非常有用,因为它们能够从外部访问包的内部。 - T.E.D.
我知道的!真的!非常感谢,正合适。 - Simon Wright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接