我知道私有变量的概念是不应该访问它们,我确实希望它在程序的其余部分使用模块时以这种方式工作,但我需要它来检查内部模块的运作。
说我有以下简化示例:
module mod
implicit none
private
integer :: value
public :: set_value
contains
subroutine set_value(input)
implicit none
integer,intent(in) :: input
value=input
end subroutine
end module
我现在想测试子程序以查看它是否实际上正在执行我想要的操作:我想编写一个使用该模块的程序,使用输入8调用例程set_value
然后检查是否内部变量value
现在是8。
我可以这样做吗?或者它是否有另一种单元测试私有变量初始化器的方法?
答案 0 :(得分:6)
我看到你有三种方法。
编写一个get函数来获取值并进行测试。你在评论中指出这是次优的,所以..
如果您有支持Fortran 2003的编译器(例如现代Fortran编译器的任何最新版本),请使用protected
属性而不是private
属性声明该变量。这将允许您从任何代码中读取变量,但不能修改。这将强制它只能通过你的setter函数设置,但你可以直接在你的单元测试中检查它的值。
integer, protected :: value
最后,如果所有其他方法都失败了,您可以有条件地编译模块,以便有时变量不是私有的。例如,执行以下操作:
module mod
implicit none
private
integer :: value
public :: set_value
#ifdef UNITTESTING
public :: value
#endif
contains
...
end module
然后将文件名从.f90
更改为.F90
,以便对其进行预处理(至少在gfortran和ifort上)。正常编译时,value
将是私有的,但如果您使用标记-DUNITTESTING
进行编译,那么value
将是公开的。编译测试用例时,使用该标志,他们现在可以直接检查变量。