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

MFTF中无法通过Preference重写ModuleResolverService类替换getAdminToken调用

问题分析

MFTF的WebApiAuth::getAdminToken()是静态方法无法直接重写,你尝试用Magento的Preference重写调用它的ModuleResolverService类,但mftf generate:tests命令未触发重写——核心原因是该命令是独立于Magento应用的CLI工具,没有初始化Magento依赖注入容器,而Preference是Magento DI系统的特性,仅在容器初始化场景下生效。

解决方案

1. 创建自定义WebApiAuth类

在你的自定义模块中实现修改后的token逻辑:

<?php
namespace Vendor\CustomModule\DataTransport\Auth;

use Magento\FunctionalTestingFramework\DataTransport\Auth\WebApiAuth as OriginalWebApiAuth;

class CustomWebApiAuth extends OriginalWebApiAuth
{
    public static function getAdminToken(): string
    {
        // 替换为你的自定义逻辑,示例:
        $originalToken = parent::getAdminToken();
        // 自定义token处理逻辑
        return $originalToken;
    }
}

2. 重写ModuleResolverService类(利用类加载优先级)

因为MFTF直接通过类名实例化ModuleResolverService,所以用类重写+Composer自动加载优先级替换原类:
在自定义模块中创建对应类:

<?php
namespace Vendor\CustomModule\Util\ModuleResolver;

use Vendor\CustomModule\DataTransport\Auth\CustomWebApiAuth;
use Magento\FunctionalTestingFramework\Util\ModuleResolver\ModuleResolverService as OriginalService;

class ModuleResolverService extends OriginalService
{
    // 找到原类中调用WebApiAuth::getAdminToken()的方法,重写该方法
    // 示例(需匹配原类实际方法名):
    public function retrieveAdminToken()
    {
        // 替换为调用自定义类的静态方法
        return CustomWebApiAuth::getAdminToken();
    }
}

3. 配置Composer自动加载优先级

在自定义模块的composer.json中添加规则,让系统优先加载你的重写类:

{
    "autoload": {
        "psr-4": {
            "Magento\\FunctionalTestingFramework\\Util\\ModuleResolver\\": "src/Util/ModuleResolver/"
        }
    }
}

执行命令更新自动加载规则:

composer dump-autoload

4. 验证重写效果

在自定义ModuleResolverService的重写方法中添加调试代码:

public function retrieveAdminToken()
{
    die('Custom ModuleResolverService loaded!');
    return CustomWebApiAuth::getAdminToken();
}

重新执行MFTF命令:

php -d memory_limit=-1 vendor/bin/mftf generate:tests AdminLoginSuccessfulTest

如果输出Custom ModuleResolverService loaded!,说明重写生效,之后移除调试代码即可。

应急替代方案(不推荐)

如果上述方法无效,可直接修改MFTF核心文件,将WebApiAuth::getAdminToken()替换为你的自定义类调用,但需用补丁工具持久化修改(避免Composer更新覆盖):

  1. 安装补丁工具:composer require cweagans/composer-patches
  2. 创建补丁文件记录修改内容
  3. 在项目根目录composer.json中配置补丁:
{
    "extra": {
        "patches": {
            "magento/magento-functional-testing-framework": {
                "Customize admin token retrieval": "patches/module-resolver-service.patch"
            }
        }
    }
}

执行composer install应用补丁。


内容的提问来源于stack exchange,提问作者Achal Saxena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:40:34