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更新覆盖):
- 安装补丁工具:
composer require cweagans/composer-patches - 创建补丁文件记录修改内容
- 在项目根目录
composer.json中配置补丁:
{ "extra": { "patches": { "magento/magento-functional-testing-framework": { "Customize admin token retrieval": "patches/module-resolver-service.patch" } } } }
执行composer install应用补丁。
内容的提问来源于stack exchange,提问作者Achal Saxena
相关产品推荐
相关产品推荐

