运行intellij平台插件测试时,未调用java自定义引用贡献器

gxwragnw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(437)

我正在为intellij平台(实际上是phpstorm)开发一个插件。
我的插件在php语言的字符串文本表达式中提供引用。我创建了一个引用贡献者和几个引用提供者类。当我在phpstorm中运行插件时,它运行得非常好。
我的插件变大了,所以我决定为它写一些测试。我使用intellij idea“createtest”操作创建了一个单元测试,并选择了junit3。当我运行test(参见下面的代码)时,类 MyPsiReferenceContributor 根本没有被访问,测试预期会失败(“测试失败”)。 parent.getReferences() 返回空数组( parent 是stringliteralexpressionimpl的示例。
似乎是这样 MyPsiReferenceContributor 未在测试环境中注册。
我应该怎么做才能使我的参考贡献者在测试中可用?
我用了这个项目https://github.com/haehnchen/idea-php-symfony2-plugin 举个例子,但是我的插件不像他们那样使用gradle。
我就是这样注册我的参考投稿人的 plugin.xml :

<extensions defaultExtensionNs="com.intellij">
    <psi.referenceContributor implementation="com.zenden2k.MyFrameworkIntegration.MyPsiReferenceContributor"/>
</extensions>

这是我的参考撰稿人:

public class MyPsiReferenceContributor extends PsiReferenceContributor {
    // This is not being called while running tests! :(
    @Override
    public void registerReferenceProviders(PsiReferenceRegistrar registrar) {
        MyPsiReferenceProvider provider = new MyPsiReferenceProvider();
        registrar.registerReferenceProvider(StandardPatterns.instanceOf(StringLiteralExpression.class), provider);
    }
}

这是我的测试用例:

package com.zenden2k.MyFrameworkIntegration.tests;

import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.testFramework.fixtures.BasePlatformTestCase;

public class MyPsiReferenceContributorTest extends BasePlatformTestCase {
    public void setUp() throws Exception {
        super.setUp();

        myFixture.copyFileToProject("GetStaticDatasourceFixture.php");
        myFixture.copyFileToProject("user.xml");
    }

    protected String getTestDataPath() {
        return "src/test/com/zenden2k/MyFrameworkIntegration/tests/fixtures";
    }

    public void testThatStaticDatasourceReferenceIsProvided() {
        final ElementPattern<?> pattern = PlatformPatterns.psiElement().withName("test");
        myFixture.configureByText("user.php",
                        "<?php \n" +
                        "class MyClass extends CXMLObject {\n" +
                        "  public function test() {\n" +
                        "     $this->getStaticDatasource('t<caret>est');\n" +
                        "  }\n" +
                        "}\n"
        );

        PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
        if (psiElement == null) {
            fail("Fail to find element in caret");
        }

        PsiElement parent = psiElement.getParent();
        final PsiReference[] ref = parent.getReferences();
        for (PsiReference reference : ref) {
            PsiElement element = reference.resolve();
            if (pattern.accepts(element)) {
                return;
            }
        }
        fail("Test failed");
    }
}
ou6hu8tu

ou6hu8tu1#

首先,推荐使用gradle开发插件。你可以查看gradle docs部分的构建插件以了解更多细节。
intellij平台sdk代码示例库中提供了一个简单的语言示例项目,该项目涵盖了psi引用的测试。

相关问题