You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 => \&gtod,
    ]
);
  • 调整模块加载顺序,先加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:53:09