使用Test2::Mock时遭遇Prototype mismatch警告的解决方法求助
如何消除Test2::Mock覆写Time::HiRes::gettimeofday时的原型不匹配警告?
运行以下Perl代码:
#!/usr/bin/env perl use 5.038; use Test2::Mock; use Time::HiRes; my($mock) = Test2::Mock->new( class => 'Time::HiRes', override => [ gettimeofday => sub { return 1; }, ] ); my($foo) = Time::HiRes::gettimeofday; say $foo;
会输出:
Prototype mismatch: sub Time::HiRes::gettimeofday () vs none at /opt/perl/lib/site_perl/5.38.0/Test2/Mock.pm line 434. 1 Prototype mismatch: sub Time::HiRes::gettimeofday: none vs () at /opt/perl/lib/site_perl/5.38.0/Test2/Mock.pm line 452.
我尝试了多种方法来消除这些原型不匹配警告,但都无效:
- 为匿名子例程添加原型:
gettimeofday => sub () { return 1; },
- 在BEGIN块中定义带原型的命名子例程并使用:
BEGIN { sub gtod () { return 1; } } my($mock) = Test2::Mock->new( class => 'Time::HiRes', override => [ gettimeofday => \>od, ] );
调整模块加载顺序,先加载Time::HiRes再加载Test2::Mock
将gettimeofday导入main包并覆写,结合原型设置:
use Test2::Mock; use Time::HiRes qw(gettimeofday); my($mock) = Test2::Mock->new( class => 'main', override => [ gettimeofday => sub () { return 1; }, ] ); my($foo) = gettimeofday; say $foo;
- 将Mock创建代码包裹在
no warnings 'prototype'块中:
{ no warnings 'prototype'; my($mock) = Test2::Mock->new( class => 'main', override => [ gettimeofday => sub () { return 1; }, ] ); }
所有尝试都没能解决问题,代码虽然能正常运行,但警告的存在肯定有原因,我希望用正确的方式解决。目前谷歌搜索到的最佳方案是修改$SIG{__WARN__}来抑制消息,但如果有其他选择,我不想这么做。
注:我了解Test::Mock::Time、Test::MockTime和Test::MockTime::HiRes,但它们无法满足我的需求,因此决定自行实现。另外我也了解Sub::Prototype,但它不是核心模块,除非别无选择否则不想使用(届时可能会选择修改$SIG{__WARN__})。
内容的提问来源于stack exchange,提问作者Joe Casadonte
相关产品推荐
相关产品推荐

